微信js支付

178 阅读4分钟

为什么叫js支付?

首先这个本来是公众号支付,但是也叫js支付,而且这个名字更准确,更本质。为什么呢?因为微信唤起密码控件,是基于js代码来实现,具体来说是微信app(相当于是微信浏览器)自己的js代码,你用它的代码,并且必须在微信app内才能执行微信js代码(其实就是微信自己封装的js对象)。说白了,就是必须在微信app内才能支付。

架构图

image.png

核心步骤就两个,

1.  预支付

即先支付,创建订单

2.  唤起密码框

刚才第一步支付的时候,会创建订单,并且同步返回一个预支付订单id。

这个预支付订单id先返回给支付系统(后台代码),支付系统后台代码再返回给支付系统前端代码(运行在微信app里面),前端代码有了这个预支付id就可以唤起密码框,用户输入密码真正支付。

这里要注意的一点是,第二步是用户和微信通信,不经过支付系统,即用户——》微信。而第一步,是用户——》支付系统——》微信。为什么呢?为什么第二步不经过支付系统呢?因为不需要啊,而且密码是微信密码,和支付系统无关,也不可能把密码给支付系统。

支付

接口文档

pay.weixin.qq.com/wiki/doc/ap…

入参

商户号

订单号

金额


示例

{
	"mchid": "1900006XXX", //商户号:哪个商家收钱/收款人是谁
	"out_trade_no": "1217752501201407033233368318",
	"appid": "wxdace645e0bc2cXXX", //公众号id
	"description": "Image形象店-深圳腾大-QQ公仔",
	"notify_url": "https://www.weixin.qq.com/wxpay/pay.php",
	"amount": {
		"total": 1, //金额:支付多少钱
		"currency": "CNY"
	},
	"payer": { //付款人
		"openid": "o4GgauInH_RCEdvrrNGrntXDuXXX" //付款人id/微信id
	}
}

出参

预支付id

示例

{
	"prepay_id": "wx26112221580621e9b071c00d9e093b0000" //给接下来唤起密码框使用:相当于唯一标记哪一笔订单
}

源码

1、入参

image.png

代码里的入参其实就是接口文档里的入参

2、  出参

image.png

代码里的返回数据就是出参:预支付id

唤起密码框

主要作用?

用户输入密码!!!


接口文档

pay.weixin.qq.com/wiki/doc/ap…

入参

主要是:

预支付id

签名


示例

function onBridgeReady() {
    WeixinJSBridge.invoke('getBrandWCPayRequest', {
        "appId": "wx2421b1c4370ec43b",     //公众号ID,由商户传入     
        "timeStamp": "1395712654",     //时间戳,自1970年以来的秒数     
        "nonceStr": "e61463f8efa94090b1f366cccfbbb444",      //随机串     
        "package": "prepay_id=wx21201855730335ac86f8c43d1889123400", //预支付id
        "signType": "RSA",     //微信签名方式:     
        "paySign": "oR9d8PuhnIc+YZ8cBHFCwfgpaK9gd7vaRvkYD7rthRAZ/X+QBhcCYL21N7cHCTUxbQ+EAt6Uy+lwSN22f5YZvI45MLko8Pfso0jm46v5hqcVwrk6uddkGuT+Cdvu4WBqDzaDjnNa5UK3GfE1Wfl2gHxIIY5lLdUgWFts17D4WuolLLkiFZV+JSHMvH7eaLdT9N5GBovBwu5yYKUR7skR8Fu+LozcSqQixnlEZUfyE55feLOQTUYzLmR9pNtPbPsu6WVhbNHMS3Ss2+AehHvz+n64GDmXxbX++IOBvm2olHu3PsOUGRwhudhVf7UcGcunXt8cqNjKNqZLhLw4jq/xDg==" //微信签名 
    },
    function(res) {
        if (res.err_msg == "get_brand_wcpay_request:ok") {
            // 使用以上方式判断前端返回,微信团队郑重提示:
            //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
        }
    });
}
if (typeof WeixinJSBridge == "undefined") {
    if (document.addEventListener) {
        document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
    } else if (document.attachEvent) {
        document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
        document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
    }
} else {
    onBridgeReady();
}

出参

返回值描述
get_brand_wcpay_request:ok支付成功
get_brand_wcpay_request:cancel支付过程中用户取消
get_brand_wcpay_request:fail支付失败

js回调函数的入参的值,如果是get_brand_wcpay_request:ok,那么就是支付成功。

源码

function onBridgeReady() {
    WeixinJSBridge.invoke('getBrandWCPayRequest', {
        "appId": "wx2421b1c4370ec43b",     //公众号ID,由商户传入     
        "timeStamp": "1395712654",     //时间戳,自1970年以来的秒数     
        "nonceStr": "e61463f8efa94090b1f366cccfbbb444",      //随机串     
        "package": "prepay_id=wx21201855730335ac86f8c43d1889123400", //预支付id
        "signType": "RSA",     //微信签名方式:     
        "paySign": "oR9d8PuhnIc+YZ8cBHFCwfgpaK9gd7vaRvkYD7rthRAZ/X+QBhcCYL21N7cHCTUxbQ+EAt6Uy+lwSN22f5YZvI45MLko8Pfso0jm46v5hqcVwrk6uddkGuT+Cdvu4WBqDzaDjnNa5UK3GfE1Wfl2gHxIIY5lLdUgWFts17D4WuolLLkiFZV+JSHMvH7eaLdT9N5GBovBwu5yYKUR7skR8Fu+LozcSqQixnlEZUfyE55feLOQTUYzLmR9pNtPbPsu6WVhbNHMS3Ss2+AehHvz+n64GDmXxbX++IOBvm2olHu3PsOUGRwhudhVf7UcGcunXt8cqNjKNqZLhLw4jq/xDg==" //微信签名 
    },
    function(res) {
        if (res.err_msg == "get_brand_wcpay_request:ok") {
            // 使用以上方式判断前端返回,微信团队郑重提示:
            //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
        }
    });
}
if (typeof WeixinJSBridge == "undefined") {
    if (document.addEventListener) {
        document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
    } else if (document.attachEvent) {
        document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
        document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
    }
} else {
    onBridgeReady();
}