统一下单接口

本文是【浅析微信支付】系列文章的第五篇,主要讲解如何调用统一下单接口生成预支付单及调起支付页面。

浅析微信支付系列已经更新四篇了哟~,没有看过的朋友们可以看一下哦。

浅析微信支付:微信公众号网页授权arrow-up-right

浅析微信支付:开发前的准备arrow-up-right

上面是本文的前置文章,有前面几篇文章的基础以后看会更加明了,如果已经看过的小伙伴可以忽略。

1、什么是[统一下单接口]?

首先我们要明白这个问题,需要先行看一下微信的官方文档: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1arrow-up-right

官方解释如下:

除被扫支付场景以外,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易会话标识后再按扫码、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统一下单接口:

以上代码详细说明了每个字段的含义,具体的代码可以看一下作者的github,文末有对应的地址。

下面说一个特殊情况,在我们支付的时候,有时候用户会取消支付,等一段时间再重新调起,这时候,需要用到另外一个方法,那就是二次支付,所以,在我们数据库中,必须保存两个字段,用于二次支付时使用:预支付IDprepay_id、随机字符串nonce_str,此两个参数可以生成微信支付调起时需要的验证签名。

以下为二次调用时的代码:

此时我们已经调用微信统一下单接口成功,并为我们返回了需要的参数,下一步需要组装为微信支付调起时前端需要的参数。

生成支付签名

下面为组装支付签名的代码:

组装好需要的参数以后,就可以调起微信支付窗口了,如果是微信公众号支付,需要使用以下的方式调起微信支付:

PS:小程序调用方法类似,参数一致。

结语

以上就是微信支付统一下单接口的调用方式了,具体的源码可以参考作者github,最好在开发之前先通读一遍微信官方文档,此时再使用作者源码开发事半功倍,更易理解。

预告:下一篇文章,作者将讲 支付结果通知,敬请期待!!!

​如果想要提前一览源码的小伙伴,可以先看看我的 github,地址如下: ​https://github.com/YClimb/wxpay-sdk/blob/master/README.md

加作者私人微信,作者微信号如下 yclimb,标明 微信支付 可拉入微信支付讨论群与小伙伴一起探讨哦,一定要标明 微信支付 哦~

到此本文就结束了,关注公众号查看更多推送!!!

关注我的微信公众号

Last updated

Was this helpful?