微信支付点金计划配置商家小票实现支付完成跳转页面

以下仅适用于微信支付的服务商模式。

在之前的微信支付中,公众号支付和H5网页支付在支付成功后点击完成可直接跳转指定页面。

当前微信已修改,如果没有开通点金计划的服务商,支付后就会直接关闭商家页面;开通点金计划的服务商会跳转官方小票页面,但点击关闭小票页面也是直接关闭商家页面。

只有开通点金计划且设置自定义小票页面才能跳转指定的页面。

开通点金计划

点金计划《产品介绍》

点金计划具体产品开通及操作流程,请参考《点金计划产品文档

对于点金计划的开通直接参考上述文档即可

自定义商家小票

商家小票的配置参考上述文档,下面介绍小票代码写法

商家小票html代码

将该html页面地址配置到商户“商家小票链接”中,支付成功后会自动跳转到该链接,并携带参数 sub_mch_id、out_trade_no、check_code

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="referrer" content="origin">
    <meta name="viewport"
          content="width=device-width, viewport-fit=cover, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"/>
    <title>支付完成</title>
    <script type="text/javascript" charset="UTF-8" src="https://wx.gtimg.com/pay_h5/goldplan/js/jgoldplan-1.0.0.js"></script>
    <script type="text/javascript" src="https://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>

    <style>
        body {
            font-family: PingFang SC, "Helvetica Neue", Arial, sans-serif;
        }

        .order_box {
            text-align: center;
        }

        .order_box .bussiness_avt img {
            width: 68px;
            height: 68px;
            border-radius: 100%;
            border: 1px solid #E0E0E0;
        }

        .b_name {
            font-size: 14px;
            font-weight: 500;
            color: #333333;
            margin-top: 6px;
        }

        .col_box {
            margin-top: 35px;
        }

        .col_box .col {
            display: -webkit-box;
            display: -ms-flexbox;
            display: -webkit-flex;
            display: flex;
            -webkit-box-align: center;
            -ms-flex-align: center;
            -webkit-align-items: center;
            align-items: center;
            -webkit-box-pack: justify;
            -ms-flex-pack: justify;
            -webkit-justify-content: space-between;
            justify-content: space-between;
            font-size: 14px;
            color: #333;
            margin-bottom: 14px;
        }

        .col .ct.price {
            color: #E61515
        }

        .btns {
            display: -webkit-box;
            display: -ms-flexbox;
            display: -webkit-flex;
            display: flex;
            -webkit-box-pack: justify;
            -ms-flex-pack: justify;
            -webkit-justify-content: space-between;
            justify-content: space-between;
            margin-top: 31px;
        }

        .btns .btn {
            width: 147px;
            height: 35px;
            line-height: 35px;
            font-size: 14px;
            border-radius: 39px;
            border: 1px solid #CD2314;
            box-sizing: border-box;
            color: #CD2314;
        }

        .btns .btn.detail {

            background: linear-gradient(270deg, #D51010 0%, #EF4D2D 100%);
            color: #fff;
        }
    </style>
</head>

<body>
<div class="order_box">
    <div class="bussiness_avt">
        <img id="b_avt" src="{{config('app.url')}}/logo.jpeg"
             alt="">
    </div>
    <div class="b_name" id="b_name">
        商户名称
    </div>
    <div class="col_box">
        <div class="col">
            <div class="lab">产品名称</div>
            <div id="p_name" class="ct">产品名称</div>
        </div>
        <div class="col">
            <div class="lab">购买数量</div>
            <div id="count" class="ct">3</div>
        </div>
        <div class="col">
            <div class="lab">实付金额</div>
            <div id="price" class="ct price">¥</div>
        </div>
    </div>
    <div class="btns">
        <div id="backHome" class="btn home">返回首页</div>
        <div id="toOrder" class="btn detail">查看详情</div>
    </div>
</div>

<script>
    //获取返回页面参数
    function getQueryString(name) {
        var query = window.location.search.substring(1);
        var vars = query.split("&");
        for (var i = 0; i < vars.length; i++) {
            var pair = vars[i].split("=");
            if (pair[0] === name) {
                return pair[1];
            }
        }
        return null;
    };

    //获取参数
    var sub_mch_id = getQueryString("sub_mch_id"); //特约商户号
    console.log("sub_mch_id is " + sub_mch_id)
    var out_trade_no = getQueryString("out_trade_no"); //商户订单号
    console.log("out_trade_no is " + out_trade_no)
    var check_code = getQueryString("check_code"); //md5 校验码
    console.log("check_code is " + check_code)

    // 通过接口获取订单信息
    $.ajax({
        type: "GET",
        url: "/api/order/goldPlanCallbackApi",
        data: {
            sub_mch_id: sub_mch_id,
            out_trade_no: out_trade_no,
            check_code: check_code
        },
        dataType: "json",
        success: function (data) {
            console.log(data)
            if (data.code === 200) { # 将订单信息赋值当前html页面
                var info = data.data;
                var homeLink = info.homeLink
                var detailLink = info.detailLink
                $("/topic/%E5%BE%AE%E4%BF%A1/x569xe4yep.html#b_avt").src = info.merchantIcon
                $("/topic/%E5%BE%AE%E4%BF%A1/x569xe4yep.html#b_name").html(info.company)
                $("/topic/%E5%BE%AE%E4%BF%A1/x569xe4yep.html#p_name").html(info.product_name)
                $("/topic/%E5%BE%AE%E4%BF%A1/x569xe4yep.html#count").html(info.total_num)
                $("/topic/%E5%BE%AE%E4%BF%A1/x569xe4yep.html#price").html(info.money)
                //初始化小票
                var initData = {
                    action: 'onIframeReady',
                    displayStyle: 'SHOW_CUSTOM_PAGE'
                }
                var initPostData = JSON.stringify(initData)
                parent.postMessage(initPostData, 'https://payapp.weixin.qq.com')

                //注册点击事件(去详情)
                document.getElementById("toOrder").onclick = function () {
                    var mchData = {
                        action: 'jumpOut',
                        jumpOutUrl: detailLink //跳转的页面
                    }
                    var postData = JSON.stringify(mchData)
                    parent.postMessage(postData, 'https://payapp.weixin.qq.com')
                }
                //注册点击事件(去首页)
                document.getElementById("backHome").onclick = function () {
                    var mchData = {
                        action: 'jumpOut',
                        jumpOutUrl: homeLink //跳转的页面
                    }
                    var postData = JSON.stringify(mchData)
                    parent.postMessage(postData, 'https://payapp.weixin.qq.com')
                }
            }

        }
    });
</script>
</body>

</html>

上述代码效果图:

获取订单信息接口说明

在接口中要进行订单校验,校验方法参考 《点金计划产品文档

校验成功返回正常订单信息,失败返回异常信息。


# 点金计划页面获取订单详情接口

public function goldPlanCallbackApi(Request $request): JsonResponse
{
        $sub_mch_id = $request->input('sub_mch_id', '');
        $out_trade_no = $request->input('out_trade_no', '');
        $check_code = $request->input('check_code', '');
        if (empty($check_code) || empty($out_trade_no) || empty($sub_mch_id)) {
            return responseError(ApiStatus::PARAM_ERROR);
        }
        $order = Order::query()
            ->where(['order_number' => $out_trade_no])
            ->firstOrFail(['id', 'order_number', 'uid', 'total_num', 'price', 'pay_price', 'transaction_id'])
            ->toArray();
        if (md5(config('app.url') . '/order/goldPlanCallback?sub_mch_id=' . $sub_mch_id . '&out_trade_no=' . $out_trade_no . '&transaction_id=' . $order['transaction_id']) == $check_code) {
            # 订单产品信息
            $data = [
                'id' => $order['id'],
                'money' => $order['pay_price'],
                'total_num' => $order['total_num'],
                'product_name' => $subject,
                'company' => '商户名称',
                'merchantIcon' => config('app.url') . '/logo.jpeg',
                'homeLink' => config('app.h5_url'),
                'detailLink' => config('app.h5_url') . "/pages/orderDetail/orderDetail?id=" . $order['id'],
            ];
        } else {
            $data = [
                'id' => $order['id'],
                'money' => 0,
                'total_num' => 0,
                'product_name' => '异常订单',
                'company' => '商户名称',
                'merchantIcon' => config('app.url') . '/logo.jpeg',
                'homeLink' => config('app.h5_url'),
                'detailLink' => config('app.h5_url') . "/pages/orderDetail/orderDetail?id=" . $order['id'],
            ];
        }
        return responseSuccess($data);
    }

引用链接

[1] 《产品介绍》: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/open/pay/chapter3_5_1.shtml
[2] 点金计划产品文档: https://wx.gtimg.com/pay/download/goldplan/goldplan_product_description_v2.pdf
[3] 点金计划产品文档: https://wx.gtimg.com/pay/download/goldplan/goldplan_product_description_v2.pdf