微信小程序支付过程详解,基于node.js的后台

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xWF_NET/article/details/77101944

最近的一个月一直在研究小程序,其中的支付过程一直困扰了我很久,看过大神的帖子之后,按照大神的步骤一步步操作,终于解决。以下详细分析微信小程序的支付过程。

首先附上大神的帖子:http://blog.csdn.net/zhuming3834/article/details/73168056

一、发起微信支付之前首先要有的四个参数

   globalData: {
    appid: 'wxcd3**************d149d',//appid需自己提供,此处的appid我随机编写  
    secret: '3dc5f7b************6eb45bb',//secret需自己提供,此处的secret我随机编写  
    Mch_id: "148*******22", // 商户号
    Mch_key: "jJn0haD**************qZ7Bty1Z60e", // 商户key
  }
接下来我会解释这四个参数的来源并将其放置在小程序的app.js文件中的全局变量中,就如同上图所示。当然,这些参数的具体数值不带*(哈哈哈)

①appid和secret的获取

  登陆微信公众平台自己注册好的小程序账户,appid和appsecret会显示在如下位置


需要注意的是,一个小程序会对应一个appid,这个appid是不会变的,同时还会有一个appSecret,这个密钥在你第一次查看时显示一次,没记错的话应该是需要管理员进行扫码,这时你需要将这个密钥记录下来,如果你忘记了这个密钥,可以通过页面上的重置获取,但之前的密钥就失效了。

②Mch_id和Mch_key的获取

每个需要支付的小程序都需要在微信商户平台注册商户号,获取Mch_id和Mch_key(注册的过程不太清楚,以下的截图是如何获取已知的商户的数据)

Mch_id(商户号)


Mch_key(商户密钥)


需要注意的是:Mch_Key需要配置32位的随机数,自己设定的(建议使用Md5值)

二、获取微信使用者的openid

①、获取code码

wx.login({
   success: function(res) {
      if (res.code) {
         //接下来的请求写在这里
      } else {
          console.log('获取用户登录态失败!' + res.errMsg)
      }
    }
});
调用微信的API中的wx.login方法,在回调函数中获取code值。

②用上一步中获取到的code值和第一步中获取到的appId和secret换取openid

注:openid是微信用来标识唯一微信用户的
以下是小程序端的代码(将上述的三个值传到后台处理)
wx.request({
    url: config.service.payUrl,
    //发送 用户code  小程序appId app秘钥
    data: {
      code: res.code,
      appid: app.globalData.appId,
      secret: app.globalData.appSecret,
    },
    method: "POST",
    header: {
      "Content-Type": "application/x-www-form-urlencoded"
    },
    success: function (res) {
      // 用户唯一id
        var openid = res.data.openid;
        console.log(res)
        console.log("this is openId:" + openid)
    }
})
以下是后台处理代码
function mainpay(req, response) {
	var url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + req.body.appid + "&secret=" + req.body.secret + "&code=" + req.body.code + "&grant_type=authorization_code";
	https.get(url, function(resu) {
		//res.send(resu)
		var datas = [];
		var size = 0;
		resu.on('data', function(result) {
			response.send(result)

		});
	}).on("error", function(err) {
		Logger.error(err.stack)
		callback.apply(null);
	});
}
后台接受小程序端的请求,将传过来的appId,secret,code值拼接成一个固定格式的Url地址,并从后台向小程序的官方服务器发起请求,官方服务器处理请求后会将appid以JSON的形式返回





展开阅读全文

没有更多推荐了,返回首页