前言:
这几天做微信支付功能,第一次做支付功能,踩了好多的坑,写这文章,警示自己不要再次犯错,也给其它的开发者提供思路及解决的方法。前台android与后台的java都是自己做的,所以,该踩的坑都踩了。哈哈!
一、java后台代码
1.1、后台请求
关键是PayUtil中的wxPayObject()方法。
/**
* 获取微信支付信息
*/
@RequestMapping("/getWeiXinPayMessage")
@ResponseBody
public Object getWeiXinPayMessage(HttpServletRequest request) {
BxRecordParams params = SystemUtil.getInstance().getCommonParams(BxRecordParams.class, request);
Integer userId;// 用户id
Integer fid; // 分公司id
Integer type; // 支付类型
Integer clientType;
if (null == params || null == (userId = params.getUserId()) || 0 == userId || null == (fid = params.getFid())
|| 0 == fid || null == (clientType = params.getClientType()) || !clientTypeList.contains(clientType)
|| null == (type = params.getType()) || !payTypeList.contains(type)) {
return new ArdRestResponse(ArdEnum.UNSUCCESS_USID.code(), ArdEnum.UNSUCCESS_USID.message(), null);
}
WeiXinPay weixin = new WeiXinPay();
if (1 == clientType) {
// 表示客户端
if (0 == type) {
// 表示为支付类型为订单
// 需要检查订单状态及支付的状态
Integer orderId = params.getOrderId();
if (null == orderId) {
return new ArdRestResponse(-1, "订单号不存在,请重试!", null);
}
Order order = orderMapper.load(orderId);
if (null == order) {
return new ArdRestResponse(-1, "该订单不存在,请重试!", null);
}
boolean flag = false;//存在标记
List<PaymentHistory> payList = paymentHistoryMapper.getPayListForOrderId(orderId);
if (null != payList && payList.size() > 0) {
for(int i = 0; i < payList.size(); i++) {
PaymentHistory paymentHistory = payList.get(i);
if(null != paymentHistory && "1".equals(paymentHistory.getStatus())) {
return new ArdRestResponse(88, "该订单已支付", null);
}
}
}
String orderNo = order.getOrderNo();
/*
* 这里要注意下,
微信后台总是返回 订单号重复,所以,要添加订单号后面添加"_" + 随机数,
这样每次请求的订单号就不同了
*/
String randomCode = orderNo + "_" +Util.getRandomStringByLength(5);
double yfhj = order.getYfhj();
//关键代码,请求微信后台地址(其它的是我的业务代码,大家可以忽略) 主要是返回预付款id,也就是微信文档中的统一下单 费用单位是分,必须是整数
Map<String, String> result = PayUtil.wxPayObject(request, WXConst.PAY_CUSTOMER_APP_ID,
WXConst.PAY_MERCHANT_NUMBER, WXConst.PAY_PRIVATE_KEY, "订单费用", randomCode, ((int) (1000 * yfhj)));
String mch_id, prepay_id, appid, nonce_str, sign;
if (null != result && "success".equals(result.get("status"))
&& !StringUtils.isEmpty(prepay_id = result.get("prepay_id"))
&& !StringUtils.isEmpty(appid = result.get("appid"))
&& !StringUtils.isEmpty(nonce_str = result.get("nonce_str"))
&& !StringUtils.isEmpty(sign = result.get("sign"))
&& !StringUtils.isEmpty(mch_id = result.get("mch_id"))) {
weixin.setAppid(appid);
weixin.setMerchantNumber(mch_id);
weixin.setPrepaidMoneyId(prepay_id);