<a name="PryPh"></a>

1.PC网站-微信支付

要将PC网站接入微信支付,您需要完成以下步骤:

  1. 获取商户号:首先,您需要注册一个微信商户号。您可以通过微信支付的官方网页申请一个商户号。
  2. 开通微信支付:申请商户号后,您需要完成微信支付的开通流程。具体步骤可以通过微信支付的官方文档找到。
  3. 配置支付参数:在接入微信支付前,您需要根据官方文档的要求配置支付参数,包括公众号的AppID、商户号、API密钥等。
  4. 用户选择微信支付后,需要将购买的商品Id,商品数量,金额,token等信息传送到开发者服务器
  5. 开发者服务器在接收到商品Id、商品数量,金额,并从token中解析出用户id后,生成服务器订单数据(存入订单表)
  6. 之后,开发者服务器会调用微信支付接口,并将商品信息、订单号、支付金额等作为参数传递给微信支付接口。 微信生成预支付订单(prepay_id),
  7. 并返回一个支付链接给后端, 后端可以由此生成二维码返回给前端 (和小程序支付不一样)

请求参数

{
	"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"
}
  1. 调起支付:用户用微信手机端扫描二维码,进入微信支付的链接
  2. 接下来的一系列操作都是由用户来操作的,包括了微信支付密码,指纹等验证,确认支付之后执行鉴权调起支付。
  3. 用户在微信支付收银台完成支付或取消支付
  4. 用户支付完成后,微信会异步通知后台服务器。后台服务器根据微信后台返回的支付结果来更新订单的状态
  5. 这个过程中,前端页面通过定时器不断轮询后端接口,查看订单支付状态,根据订单状态来展示前端页面。 <a name="OgJOn"></a>

2.微信小程序-微信支付-面试题回答

  1. 获取商户号:首先,您需要注册一个微信商户号。您可以通过微信支付的官方网页申请一个商户号。
  2. 开通微信支付:申请商户号后,您需要完成微信支付的开通流程。具体步骤可以通过微信支付的官方文档找到。
  3. 配置支付参数:在接入微信支付前,您需要根据官方文档的要求配置支付参数,包括公众号的AppID、商户号、API密钥等。
  4. 打开小程序,点击直接下单。
  5. 此时,如果已经登录,直接下单,如果还没有登录,则 用wx.login获取用户临时登录凭证code,发送到后端服务器换取openId, openId会加密到token中传回客户端
  6. 在下单时,小程序需要将购买的商品Id,商品数量,以及token传送到开发者服务器。
  7. 开发者服务器在接收到商品Id、商品数量, 并从token解析出openId后,生成服务器订单数据(存入订单表),同时经过一定的签名算法,向微信支付发送请求,获取预付单信息(prepay_id),同时将获取的数据再次进行相应规则的签名,向小程序端响应必要的信息。
  8. 小程序端在获取对应的参数后,调用wx.requestPayment()发起微信支付,唤醒支付工作台,进行支付。
wx.requestPayment({
  // 时间戳
  timeStamp: '',
  // 随机字符串
  nonceStr: '',
  // 统一下单接口返回的 prepay_id 参数值
  package: '',
  // 签名算法,应与后台下单时的值一致
  signType: '',
  // 签名
  paySign: '',
  // 调用成功回调
  success (res) {
     
  },
  // 失败回调
  fail () {},
  // 接口调用结束回调
  complete () {}
})
  1. 接下来的一系列操作都是由用户来操作的,包括了微信支付密码,指纹等验证,确认支付之后执行鉴权调起支付。
  2. 鉴权调起支付:在微信后台进行鉴权,微信后台直接返回给前端支付的结果,前端收到返回数据后对支付结果进行展示。
  3. 推送支付结果:微信后台在给前端返回支付的结果后,也会向后台(商家后台)也返回一个支付结果,后台通过这个支付结果来更新订单的状态。

<a name="vIPE7"></a>

3.微信公众号-微信支付-面试题回答

公众号接入支付: https://pay.weixin.qq.com/static/applyment_guide/applyment_detail_public.shtml

  1. 获取商户号:首先,您需要注册一个微信商户号。您可以通过微信支付的官方网页申请一个商户号。
  2. 开通微信支付:申请商户号后,您需要完成微信支付的开通流程。具体步骤可以通过微信支付的官方文档找到。
  3. 配置支付参数:在接入微信支付前,您需要根据官方文档的要求配置支付参数,包括公众号的AppID、商户号、API密钥等。
  4. 用户在公众号的页面上下单,携带下单信息和token调用商家后台的下单接口,
  5. 商家后台从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"
}
  1. 商家后台接收到返回的预支付id后,会生成调起支付需要的参数,传给前端
  2. 前端收到后台的支付参数后,调用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下单接口,微信后台系统返回链接参数h5_url,用户使用微信外部的浏览器访问该h5_url地址调起微信支付中间页