微信小程序调用微信支付,不需要搭建服务器


微信小程序开发者工具最近推出了新的功能,云开发,也就是severless。提供了云函数,云数据库等等。这方便了我们进行服务端的开发,不再需要买域名,域名ICP备案,租服务器,数据库等等。当然,各有各的好处,这是无可厚非的。

关于云开发的设置,这里就不多阐述了,比较简单。

这里的云函数,使用的是Nodejs 8.9.2, 所以本意上就是写 Nodejs。


创建一个新的小程序,可选用云开发模版,然后文件目录就像下面一样,文件夹上有朵云的就是我们写云函数的地方。如果是在现有的小程序增加云函数,需要在project.config.json里面配置好文件夹路径,具体看官方文档。



首先我建了两个云函数,第一个是用来拿到用户的openid, 有了云函数,我们不需要再去wx.login拿一个5分钟有效的code,再发送请求去获取用户openid了。第二个就是微信支付的云函数。


先说第一个云函数,Login

这里就已经把用户的信息返回到 客户端了。

这里是客户端(小程序端)代码,我们调用 wx.cloud.callFunction 里面的 'login', 获取到用户的openid,存到本地数据库中,方便我们随时获取。


现在进入到第二个云函数,正如上面所说,其实写云函数就是在写Nodejs,所以如果需要引入第三方的库,需要在 package.json 里面,写入需要引入的库。(上传云函数时,千万记得把node_modules删掉

这里并不会过多讲解代码含义,因为都是根据微信支付开发文档需要的参数,一步一步去获取到所有的参数而已,并没有过多的含义,如果看不懂,请自行观看微信支付开发文档。

 下面我们进入到 index.js

```

var wechat = require('./wechat_config.js')

var body_data = require('./bodyData.js');

var non_str_random = require('./non_str_random.js')

var cryptoMO = require('crypto');

var request = require('request');

var xml2js = require('xml2js');

var xmlParser = new xml2js.Parser({ explicitArray: false, ignoreAttrs: true })

var out_trade_no = Date.parse(new Date());

var non_str = non_str_random();

exports.main = async (event, context) => {


  var payBody = 'fee';


  var str = `appid=${wechat.appid}&body=${payBody}&mch_id=${wechat.mch_id}&nonce_str=${non_str}&notify_url=${wechat.notify_url}&openid=${event.openid}&out_trade_no=${out_trade_no}&spbill_create_ip=${wechat.ip}&total_fee=${event.total_fee}&trade_type=JSAPI&key=${wechat.key}`;


  var sign = cryptoMO.createHash('md5').update(str).digest('hex');

  var temp_body_data = body_data(wechat, payBody, non_str, event.openid, out_trade_no, event.total_fee, sign);

  return new Promise( (resolve, reject) =>

    request({

      url: wechat.url,

      method: 'POST',

      body: temp_body_data

    }, (err, res, body) => {

      xmlParser.parseString(body, (err, res)=>{

        var prepay_id = res.xml.prepay_id;

        var str = `appId=${wechat.appid}&nonceStr=${non_str}&package=prepay_id=${prepay_id}&signType=MD5&timeStamp=${out_trade_no}&key=${wechat.key}`;

        var paySign = cryptoMO.createHash('md5').update(str).digest('hex');

        return resolve({

          success: true,

          data: {

            timeStamp: out_trade_no.toString(),

            nonceStr: non_str,

            package: `prepay_id=${prepay_id}`,

            paySign: paySign,

            outTradeNo: out_trade_no

          }

        });

      })

    })

  )

}

```

这里是 wechat_config.js, 根据自己的资料,填充即可。

下面是bodyData.js

这里是 non_str_random.js

到这里整个微信支付服务端的流程就结束了。(记得上传云函数后,云函数才能被使用)


下面回到小程序端(客户端)发起微信支付申请

this.data.fee 根据自己去定义了,这个就是支付的金额,微信以分结算的,所以乘以100。

```

wechat_pay: function(){

      wx.cloud.callFunction({

      name: 'wechat_pay',

      data: {

        openid: wx.getStorageSync('openid'),

        total_fee: this.data.fee * 100

      },

      complete: res => {

        wx.requestPayment({

          timeStamp: res.result.data.timeStamp,

          nonceStr: res.result.data.nonceStr,

          package: res.result.data.package,

          signType: 'MD5',

          paySign: res.result.data.paySign,

        })

      }

    })

  }

```



到这里就是一个完整的微信支付流程了,文采一般,大家将就着看吧。

推荐阅读更多精彩内容