先搞清楚代码逻辑 整理执行顺序
https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_4&index=3
商户系统和微信支付系统主要交互:
1、小程序内调用登录接口,获取到用户的openid,api参见公共api【小程序登录API】
2、商户server调用支付统一下单,api参见公共api【统一下单API】
// https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1
public static Map<String, String> unifiedOrder(UnifiedParam param, String certUrl, String tradeType) throws Exception {
WXPay wxpay = new WXPay(new MyConfig(certUrl));
Map<String, String> data = new HashMap<>();
data.put("body", param.getBody()); //商品描述
data.put("attach", param.getAttach()); //附加数据
data.put("out_trade_no", param.getOutTradeNo()); //商户系统内部订单号,要求32个字符内,只能是数字、大小写字母 且唯一
data.put("device_info", param.getDeviceInfo()); //设备号
Integer totalFee = Integer.parseInt(null!=param.getTotalFee() ? param.getTotalFee() : "0" );
data.put("total_fee", String.valueOf(totalFee * 100)); //订单总金额(单位为分)
data.put("spbill_create_ip", param.getCreateIp()); //用户的客户端IP
data.put("notify_url", unified_notify_url); //异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
data.put("trade_type", tradeType); //此处指定为扫码支付 wx NATIVE 小程序 JSAPI
data.put("product_id", param.getProductId()); //此参数为二维码中包含的商品ID,商户自行定义
if(null!=param.getOpenId()){
data.put("openid", param.getOpenId()); // 用户在商户appid下的唯一标识
}
return wxpay.unifiedOrder(data);
}
3、商户server调用再次签名,api参见公共api【再次签名】
**特别注意 再次签名 顺序**
String nonceStr = resp.get("nonce_str");
String packageStr = "prepay_id="+resp.get("prepay_id");
String timeStamp = DateFormatUtils.getSecondTimestamp();
Map<String, String> map = new HashMap<>(7);
map.put("appId", wxAppId); //小程序appId 注意 第一次 签名appid 第二次 appId
map.put("nonceStr", nonceStr); //第一次 签名返回参数
map.put("package", packageStr); //第一次 签名返回参数
map.put("signType", "MD5");
map.put("timeStamp", timeStamp); //时间戳从1970年1月1日00:00:00至今的秒数,即当前的时间 十位数字
map.put("key", wxAppKey); //小程序appKey
StringBuffer sb = new StringBuffer();
sb.append("appId=").append(wxAppId).append("&nonceStr=").append(nonceStr).append("&package=").append(packageStr)
.append("&signType=MD5").append("&timeStamp=").append(timeStamp).append("&key=").append(wxAppKey);
map.put("paySign", WXPayUtil.MD5(sb.toString()).toUpperCase());
4、商户server接收支付通知,api参见公共api【支付结果通知API】
5、商户server查询支付结果,api参见公共api【查询订单API】