以下仅适用于微信支付的服务商模式。
在之前的微信支付中,公众号支付和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