本文是【浅析微信支付】系列文章的第五篇,主要讲解如何调用统一下单接口生成预支付单及调起支付页面。
浅析微信支付系列已经更新四篇了哟~,没有看过的朋友们可以看一下哦。
上面是本文的前置文章,有前面几篇文章的基础以后看会更加明了,如果已经看过的小伙伴可以忽略。
1、什么是[统一下单接口]?
首先我们要明白这个问题,需要先行看一下微信的官方文档:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
官方解释如下:
除被扫支付场景以外,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易会话标识后再按扫码、JSAPI、APP等不同场景生成交易串调起支付。什么意思?简单理解:就是说我们要在调起微信支付窗口之前,需要先生成一个 预支付交易单,这个单子相当于和我们自身系统的 支付交易单 一一对应,也就是我们每次支付需要记录的订单支付交易单。
从上面我们可以得到,在调用此接口之前,首先,我们系统中肯定已经需要有以下步骤:订单提交 -> 生成订单 -> 生成订单对应的支付单 -> 调用统一下单接口
好了,假设系统现在已经生成支付交易单,准备调用统一下单接口,我们来看一下具体的实现方式。
PS:调用统一下单接口时,需要注意的是必须传入异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。示例如下:
https://xxx.com/v1/weixin/pay/wxnotify
2、调用接口
示例代码:
/**  * [微信支付统一下单] - 保存调用的相关记录 <p>  * [微信支付小程序] - 返回支付唤醒参数  * @param payment 付款对象  * @param user 当前用户  * @return map  * @throws Exception e  *  * @author yclimb  * @date 2018/6/15  */ public Map<String, String> saveWxPayUnifiedOrder(Payment payment, User user) throws Exception {     if (payment == null || user == null) {         return null;     }      // 1.调用微信统一下单接口     WXPay wxPay = new WXPay(WXPayConfigImpl.getInstance());     Map<String, String> resultMap = wxPay.unifiedOrder(...);      // 1.1.记录付款流水     ...      // 下单失败,进行处理     if (WXPayConstants.FAIL.equals(resultMap.get(WXPayConstants.RETURN_CODE)) ||             WXPayConstants.FAIL.equals(resultMap.get(WXPayConstants.RESULT_CODE))) {          // 处理结果返回,无需继续执行         resultMap.put(WXPayConstants.RESULT_CODE, WXPayConstants.FAIL);         resultMap.put(WXPayConstants.ERR_CODE_DES, resultMap.get(WXPayConstants.RETURN_MSG));         return resultMap;     }      // 1.2.获取prepay_id、nonce_str     String prepay_id = resultMap.get("prepay_id");     String nonce_str = resultMap.get("nonce_str");      // 2.根据微信统一下单接口返回数据组装微信支付参数,返回结果     return wxPay.chooseWXPayMap(prepay_id, nonce_str); }以上为一个调用统一下单的接口代码,主要在于以下两句:
// 实例化一个微信支付对象,使用单例配置的方式 WXPay wxPay = new WXPay(WXPayConfigImpl.getInstance());  // 直接调用统一下单接口 Map<String, String> resultMap = wxPay.unifiedOrder(...);微信支付对象WXPay统一下单接口:
 /**  * 作用:统一下单<br>  * 场景:商户在小程序中先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易后调起支付。  * 接口链接:URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder  * 是否需要证书:否  * 接口文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1  *  * @param notify_url       公众号用户openid  * @param body             商品简单描述,该字段请按照规范传递,例:腾讯充值中心-QQ会员充值  * @param out_trade_no     商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*且在同一个商户号下唯一  * @param total_fee        订单总金额,传入参数单位为:元  * @param spbill_create_ip APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP  * @param goods_tag        订单优惠标记,用于区分订单是否可以享受优惠  * @param detail           商品详情 ,单品优惠活动该字段必传  * @par
                    