微信小程序支付联调

先搞清楚代码逻辑 整理执行顺序

	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】

Guess you like

Origin blog.csdn.net/qq_16771097/article/details/113029130