申请微信支付能力* 要想使用微信支付能力,不管是App支付、公众号支付、h5支付等支付方式都需要先在微信商户平台申请开通支付能力 。
* 申请开通支付能力的资料有公司营业执照、负责人身份证正反面等图片,相关所需的所有资料在微信官方商户平台上有说明 。
* 申请完开通支付能力后,我们会得到商户号以及appId,然后设置32位官方密钥 。
准备工作* 如果你是h5支付,还需要去微信商户平台设置支付URL的IP或者域名,一般最多可以设置5个IP或者域名,建议同时将正式环境和测试环境的IP或者域名设置好 。
* 如果你是公众号支付,同上,你也需要设置你的支付IP或者域名,注意,异步通知的URL也要在你设置的IP或者域名下 。
业务流程
- 用户在商户APP中选择商品,提交订单,选择微信支付 。(app端向服务端发起请求)
- 商户后台收到用户支付单,调用微信支付统一下单接口 。(服务端向微信请求) 。
- 通过微信支付返回的数据调起微信支付 。
- 用户在微信端支付成功 。
- 支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果 。注意 一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准 。
- 商户APP调起微信支付 。(app端利用服务端回传的参数调起微信支付)
- 商户后台接收支付通知 。(微信将支付结果异步通知服务端)
- 商户后台查询支付结果 。(微信将支付结果同步通知app端)
文章插图
时序图
注意事项
- 订单金额total_fee使用的单位是分,支付宝使用的单位是元 。
支付集成流程如下(微信和支付宝流程上基本一致,具体参考代码):
步骤1:用户在商户APP中选择商品,提交订单,选择微信支付 。(app端向服务端发起请求)
步骤2:商户后台收到用户支付单,调用微信支付统一下单接口 。(服务端向微信请求)
步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP 。参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package 。注意:package的值格式为Sign=WXPay(将微信回传的prepayid与其他参数组合返回给app端)
步骤4:商户APP调起微信支付 。(app端利用服务端回传的参数调起微信支付)
步骤5:商户后台接收支付通知 。(微信将支付结果异步通知服务端)
步骤6:商户后台查询支付结果 。(微信将支付结果同步通知app端)
微信支付代码微信统一下单接口和回调
@Overridepublic String getWxPayOrderStr(String orderNo, HttpServletRequest request) {//最终返回加签之后的,app需要传给支付宝app的订单信息字符串String orderString = "";System.out.println("==================微信下单,商户订单号为:" + orderNo);String appId = PayConfigUtil.APP_ID;//appIdString mchId = PayConfigUtil.MCH_ID;//商户idString key = PayConfigUtil.API_KEY;String currTime = PayCommonUtil.getCurrTime();String strTime = currTime.substring(8, currTime.length());String strRandom = PayCommonUtil.buildRandom(4) + "";String nonce_str = strTime + strRandom;order_price = order_price.substring(0, order_price.indexOf("."));String body = teaNames;String spbill_create_ip = PayConfigUtil.CREATE_IP;String notify_url = PayConfigUtil.NOTIFY_URL;String trade_type = "APP";SortedMap<Object, Object> map = new TreeMap<>();map.put("appid", appId);map.put("mch_id", mchId);map.put("nonce_str", nonce_str);map.put("body", body);map.put("out_trade_no", orderNo);map.put("total_fee", order_price);map.put("spbill_create_ip", spbill_create_ip);map.put("notify_url", notify_url);map.put("trade_type", trade_type);//签名数据,MD5加密String sign = PayCommonUtil.createSign("UTF-8", map, key);map.put("sign", sign);//请求微信支付,进行下单String requestXML = PayCommonUtil.getRequestXml(map);String resXml = HttpUtil.postData(PayConfigUtil.UFDODER_URL, requestXML);System.out.println("微信返回值:" + resXml);Map<String, String> data = https://www.isolves.com/it/cxkf/yy/JAVA/2020-08-12/null;try {data = XMLUtil.doXMLParse(resXml);if (data.get("return_code").equals("SUCCESS")) {//返回给APP端的参数,APP端再调起支付接口SortedMap