转载:https://blog.csdn.net/zhourenfei17/article/details/77765585
支付流程步骤:
1)首先调用wx.login方法获取code,通过code获取openid;
2)java后台调用统一下单支付接口(这里会进行第一次签名),用来获取prepay_id;
3)java后台再次调用签名(这里会进行第二次签名),并返回支付需要用使用的参数;
4)小程序前端wx.requestPayment方法发起微信支付;
5)java后台接收来自微信服务器的通知并处理结果。
详细步骤可参考:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_4&index=3
demo链接: https://pan.baidu.com/s/1v8QWUE1m2EnA4uAoAZtRRQ 密码: cgrt
调试过程中遇到的几个问题
1 nonceStr 和 tradeNo 一定要保持一致
2 在回调的时候出现调用支付jsapi缺少参数 total_fee
response.put("package", "prepay_id="+prepay_id);这个地方传参要注意
这个total_fee 缺失的原因 结合上面 的package:"prepay_id=wx201612032137135b201de80e0666789657"
其实是每个订单号只能用于支付一次 ,如果没有支付成功,那么可以再次支付,如果支付成功了,就不能支付了,,如果出现了tital_fee,只需要更改成另外一个订单号再进行支付 就行了
3 在回调的时候签名失败
这个是个大坑,一定要注意,在下订单的时候我们会生成一次签名,这个地方的参数传的都是小写appid,.....,
//组装参数,用户生成统一下单接口的签名
Map
packageParams = new HashMap();
packageParams.put("appid", WxPayConfig.APP_ID);
packageParams.put("mch_id", WxPayConfig.MCH_ID);
packageParams.put("nonce_str",nonceStr);
packageParams.put("body", params.getString("body"));
packageParams.put("out_trade_no", tradeNo);//商户订单号
packageParams.put("total_fee", totalPrice.setScale(0,BigDecimal.ROUND_DOWN).toString());//支付金额(),这边需要转成字符串类型,否则后面的签名会失败
packageParams.put("spbill_create_ip", WxUtils.getIpAddr());
packageParams.put("notify_url", WxPayConfig.NOTIFY_URL);//支付成功后的回调地址
packageParams.put("trade_type", WxPayConfig.TRADE_TYPE);//支付方式
packageParams.put("openid", openId);
packageParams.put("fee_type",WxPayConfig.FEE_TYPE);
System.out.println("package:"+packageParams);
String sign = WXPayUtil.generateSignature(packageParams, WxPayConfig.KEY); //签名
packageParams.put("sign",sign);
/** wxPay.unifiedOrder 这个方法中调用微信统一下单接口 */
Map respData = wxpay.unifiedOrder(packageParams);
往前台传参数的时候,我们需要重新生成一次签名,这个地方就变成大写了,一定要注意
//返回给APP端的参数,APP端再调起支付接口
Map response = new HashMap<>();
String prepay_id = respData.get("prepay_id");
response.put("appId", WxPayConfig.APP_ID);
response.put("package", "prepay_id="+prepay_id);
response.put("nonceStr", respData.get("nonce_str"));
response.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
response.put("signType", "MD5");
String s = WXPayUtil.generateSignature(response, WxPayConfig.KEY); //签名
response.put("sign", s);
System.out.println("response++++++:"+response);