微信支付思路
1.PC网站-微信支付
要将PC网站接入微信支付,您需要完成以下步骤:
-
获取商户号:首先,您需要注册一个微信商户号。您可以通过微信支付的官方网页申请一个商户号。
-
开通微信支付:申请商户号后,您需要完成微信支付的开通流程。具体步骤可以通过微信支付的官方文档找到。
-
配置支付参数:在接入微信支付前,您需要根据官方文档的要求配置支付参数,包括公众号的AppID、商户号、API密钥等。
-
用户选择微信支付后,需要将购买的商品Id,商品数量,金额,token等信息传送到开发者服务器
-
开发者服务器在接收到商品Id、商品数量,金额,并从token中解析出用户id后,生成服务器订单数据(存入订单表)
-
之后,开发者服务器会调用微信支付接口,并将商品信息、订单号、支付金额等作为参数传递给微信支付接口。 微信生成预支付订单(prepay_id),
-
并返回一个支付链接给后端, 后端可以由此生成二维码返回给前端 (和小程序支付不一样)
请求参数
{
"mchid": "1900006XXX", // 商家的商户号
"out_trade_no": "H51217752501201407033233368018", //商户订单号
"appid": "wxdace645e0bc2cXXX", // 应用appid
"description": "Image形象店-深圳腾大-QQ公仔",
"notify_url": "https://weixin.qq.com/", //回调,向后端返回支付结果
"amount": {
"total": 1,
"currency": "CNY"
},
"scene_info": {
"payer_client_ip": "127.0.0.1",
"h5_info": {
"type": "Wap"
}
}
}
返回参数
{
"h5_url": "https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx2916263004719461949c84457c735b0000&package=2150917749"
}
-
调起支付:用户用微信手机端扫描二维码,进入微信支付的链接
-
接下来的一系列操作都是由用户来操作的,包括了微信支付密码,指纹等验证,确认支付之后执行鉴权调起支付。
-
用户在微信支付收银台完成支付或取消支付
-
用户支付完成后,微信会异步通知后台服务器。后台服务器根据微信后台返回的支付结果来更新订单的状态
-
这个过程中,前端页面通过定时器不断轮询后端接口,查看订单支付状态,根据订单状态来展示前端页面。 <a name="OgJOn"></a>
2.微信小程序-微信支付-面试题回答
-
获取商户号:首先,您需要注册一个微信商户号。您可以通过微信支付的官方网页申请一个商户号。
-
开通微信支付:申请商户号后,您需要完成微信支付的开通流程。具体步骤可以通过微信支付的官方文档找到。
-
配置支付参数:在接入微信支付前,您需要根据官方文档的要求配置支付参数,包括公众号的AppID、商户号、API密钥等。
-
打开小程序,点击直接下单。
-
此时,如果已经登录,直接下单,如果还没有登录,则 用wx.login获取用户临时登录凭证code,发送到后端服务器换取openId, openId会加密到token中传回客户端
-
在下单时,小程序需要将购买的商品Id,商品数量,以及token传送到开发者服务器。
-
开发者服务器在接收到商品Id、商品数量, 并从token解析出openId后,生成服务器订单数据(存入订单表),同时经过一定的签名算法,向微信支付发送请求,获取预付单信息(prepay_id),同时将获取的数据再次进行相应规则的签名,向小程序端响应必要的信息。
-
小程序端在获取对应的参数后,调用wx.requestPayment()发起微信支付,唤醒支付工作台,进行支付。
wx.requestPayment({
// 时间戳
timeStamp: '',
// 随机字符串
nonceStr: '',
// 统一下单接口返回的 prepay_id 参数值
package: '',
// 签名算法,应与后台下单时的值一致
signType: '',
// 签名
paySign: '',
// 调用成功回调
success (res) {
},
// 失败回调
fail () {},
// 接口调用结束回调
complete () {}
})
-
接下来的一系列操作都是由用户来操作的,包括了微信支付密码,指纹等验证,确认支付之后执行鉴权调起支付。
-
鉴权调起支付:在微信后台进行鉴权,微信后台直接返回给前端支付的结果,前端收到返回数据后对支付结果进行展示。
-
推送支付结果:微信后台在给前端返回支付的结果后,也会向后台(商家后台)也返回一个支付结果,后台通过这个支付结果来更新订单的状态。
<a name="vIPE7"></a>
3.微信公众号-微信支付-面试题回答
公众号接入支付: https://pay.weixin.qq.com/static/applyment_guide/applyment_detail_public.shtml
-
获取商户号:首先,您需要注册一个微信商户号。您可以通过微信支付的官方网页申请一个商户号。
-
开通微信支付:申请商户号后,您需要完成微信支付的开通流程。具体步骤可以通过微信支付的官方文档找到。
-
配置支付参数:在接入微信支付前,您需要根据官方文档的要求配置支付参数,包括公众号的AppID、商户号、API密钥等。
-
用户在公众号的页面上下单,携带下单信息和token调用商家后台的下单接口,
-
商家后台从token中解析出openid, 生成订单信息,并存入数据库。之后商家后台携带请求参数调用微信的支付接口,并返回预支付id
请求参数如下:
{
"mchid": "1900006XXX", // 商户号
"out_trade_no": "1217752501201407033233368318", //商家生成的订单号
"appid": "wxdace645e0bc2cXXX", //公众号appid
"description": "Image形象店-深圳腾大-QQ公仔", // 商家描述
"notify_url": "https://www.weixin.qq.com/wxpay/pay.php", //异步接收微信支付结果通知的回调地址
"amount": {
"total": 1, // 订单总金额
"currency": "CNY" // 货币类型
},
"payer": {
"openid": "o4GgauInH_RCEdvrrNGrntXDuXXX" //用户的openid
}
}
返回参数
{
"prepay_id": "wx26112221580621e9b071c00d9e093b0000"
}
-
商家后台接收到返回的预支付id后,会生成调起支付需要的参数,传给前端
-
前端收到后台的支付参数后,调用JSAPI向微信调起支付,调起支付时需要携带后端给的参数
JSAPI和参数
// JSAPI
WeixinJSBridge.invoke('getBrandWCPayRequest', {
"appId": "wx2421b1c4370ec43b", //公众号ID,由商户传入
"timeStamp": "1395712654", //时间戳,自1970年以来的秒数
"nonceStr": "e61463f8efa94090b1f366cccfbbb444", //随机串
"package": "prepay_id=wx21201855730335ac86f8c43d1889123400",
"signType": "RSA", //微信签名方式:
"paySign": "oR9d8PuhnIc+YZ8cBHFCwfgpaK9gd7vaRvkYD7rthRAZ\/X+QBhcCYL21N7cHCTUxbQ+EAt6Uy+lwSN22f5YZvI45MLko8Pfso0jm46v5hqcVwrk6uddkGuT+Cdvu4WBqDzaDjnNa5UK3GfE1Wfl2gHxIIY5lLdUgWFts17D4WuolLLkiFZV+JSHMvH7eaLdT9N5GBovBwu5yYKUR7skR8Fu+LozcSqQixnlEZUfyE55feLOQTUYzLmR9pNtPbPsu6WVhbNHMS3Ss2+AehHvz+n64GDmXxbX++IOBvm2olHu3PsOUGRwhudhVf7UcGcunXt8cqNjKNqZLhLw4jq\/xDg==" //微信签名
},
前端逻辑
// 调起支付的函数
function onBridgeReady() {
WeixinJSBridge.invoke('getBrandWCPayRequest', {
"appId": "wx2421b1c4370ec43b", //公众号ID,由商户传入
"timeStamp": "1395712654", //时间戳,自1970年以来的秒数
"nonceStr": "e61463f8efa94090b1f366cccfbbb444", //随机串
"package": "prepay_id=wx21201855730335ac86f8c43d1889123400",
"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();
}
6.接下来的一系列操作都是由用户来操作的,包括了微信支付密码,指纹等验证,确认支付之后执行鉴权调起支付。<br />7.鉴权调起支付:在微信后台进行鉴权,微信后台直接返回给前端支付的结果,前端收到返回数据后对支付结果进行展示。<br />8.推送支付结果:微信后台在给前端返回支付的结果后,也会向后台(商家后台)也返回一个支付结果,后台通过这个支付结果来更新订单的状态。
get_brand_wcpay_request:ok 支付成功
get_brand_wcpay_request:cancel 支付过程中用户取消
get_brand_wcpay_request:fail 支付失败
<a name="l4Ukv"></a>
4.H5(webApp)调起支付
https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_4.shtml<br />商户后台系统先调用微信支付的H5下单
- 点赞
- 收藏
- 关注作者
评论(0)