转载: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);