微信小程序篇(微信小程序的支付)

转载 2017年06月24日 21:30:37

From:http://www.cnblogs.com/jcscript/p/6126722.html

微信小程序的支付和微信公众号的支付是类似的,对比起来还比公众号支付简单了一些,我们只需要调用微信的统一下单接口获取prepay_id之后我们在调用微信的支付即可。

今天我们来封装一般node的支付接口!!!

首先调用统一下单接口我们需要知道一些信息

复制代码
var bookingNo = 'davdian' + this.createNonceStr() + this.createTimeStamp()
    var deferred = Q.defer()  
    var appid = config.appId  
    var nonce_str = this.createNonceStr()  
    var timeStamp = this.createTimeStamp()  
    var url = "https://api.mch.weixin.qq.com/pay/unifiedorder"  
    var formData = "<xml>"  
    formData += "<appid>" + appid + "</appid>" //appid  
    formData += "<attach>" + attach + "</attach>" //附加数据  
    formData += "<body>" + body + "</body>"  
    formData += "<mch_id>" + mch_id + "</mch_id>" //商户号  
    formData += "<nonce_str>" + nonce_str + "</nonce_str>" //随机字符串,不长于32位。  
    formData += "<notify_url>" + notify_url + "</notify_url>"  
    formData += "<openid>" + openid + "</openid>"  
    formData += "<out_trade_no>" + bookingNo + "</out_trade_no>"  
    formData += "<spbill_create_ip>61.50.221.43</spbill_create_ip>"  
    formData += "<total_fee>" + total_fee + "</total_fee>"  
    formData += "<trade_type>JSAPI</trade_type>"  
    formData += "<sign>" + this.paysignjsapi(appid, attach, body, mch_id, nonce_str, notify_url, openid, bookingNo, '61.50.221.43', total_fee, 'JSAPI') + "</sign>"  
    formData += "</xml>"  
    var self = this
    request({  
      url: url,  
      method: 'POST',  
      body: formData  
    }, function(err, response, body) {  
      if (!err && response.statusCode == 200) {  
        var prepay_id = self.getXMLNodeValue('prepay_id', body.toString("utf-8")) 
        var tmp = prepay_id.split('[')  
        var tmp1 = tmp[2].split(']')  
        //签名  
        var _paySignjs = self.paysignjs(appid, nonce_str, 'prepay_id=' + tmp1[0], 'MD5', timeStamp)  
        var args = {  
          appId: appid,  
          timeStamp: timeStamp,  
          nonceStr: nonce_str,  
          signType: "MD5",  
          package: tmp1[0],  
          paySign: _paySignjs  
        }
        deferred.resolve(args)  
      } else {  
        console.log(body)  
      } 
    })  
    return deferred.promise  
复制代码

这个是一个统一下单接口的代码,我们需要appid小程序公众号id,mch_id商户号id,openid小程序的唯一标实,key支付用的密码,剩下的参数都是订单的信息和价格之类的,本人require进q模块使用promise,这个因人而异,可以根据自己需要来。我们需要请求https://api.mch.weixin.qq.com/pay/unifiedorder接口

注意:这里我们传递的formdata是一个xml而不是json

然后我们需要签名方法,这里我们需要封装两个方法,一个是签名方法调用统一下单接口会用到,另一个是调用小程序支付用到

统一下单接口sign:

复制代码
var ret = {  
      appid: appid,  
      attach: attach,  
      body: body,  
      mch_id: mch_id,  
      nonce_str: nonce_str,  
      notify_url: notify_url,  
      openid: openid,  
      out_trade_no: out_trade_no,  
      spbill_create_ip: spbill_create_ip,  
      total_fee: total_fee,  
      trade_type: trade_type  
    }  
    var string = this.raw(ret)  
    string = string + '&key=' + key  
    var crypto = require('crypto')  
    var sign = crypto.createHash('md5').update(string, 'utf8').digest('hex')  
    return sign.toUpperCase() 
复制代码

支付sign:

复制代码
var ret = {  
        appId: appid,  
        nonceStr: nonceStr,  
        package: package,  
        signType: signType,  
        timeStamp: timeStamp  
    }  
    var string = this.raw(ret)  
    string = string + '&key=' + key  
    var sign = crypto.createHash('md5').update(string, 'utf8').digest('hex')  
    return sign.toUpperCase()  
复制代码

注意加密的时候我们获取的是string而不是一个json,所以我们需要吧json转换成string,代码如下:

复制代码
var keys = Object.keys(args)  
    keys = keys.sort()  
    var newArgs = {}  
    keys.forEach(function(key) {  
        newArgs[key] = args[key]  
    })  
    var string = ''  
    for (var k in newArgs) {  
        string += '&' + k + '=' + newArgs[k]  
    }  
    string = string.substr(1)  
    return string  
复制代码

统一下单接口返回的是带有prepay_id的xml,所以我们需要一个方法进行解析,代码如下:

var tmp = xml.split("<" + node_name + ">")  
    var _tmp = tmp[1].split("</" + node_name + ">")  
    return _tmp[0]  

最后我们只需要把这些连接到一起就是可以获取所有微信支付所需参数,代码如下:

复制代码
//微信小程序支付封装,暂支持md5加密,不支持sha1
/**
***create order by jianchep 2016/11/22     
 **/
var config = require('../config/weapp.js')
var Q = require("q")  
var request = require("request")  
var crypto = require('crypto')  
var ejs = require('ejs')
var fs = require('fs')  
var key = config.key
module.exports = {
  // 获取prepay_id
  getXMLNodeValue: function(node_name, xml) {  
    var tmp = xml.split("<" + node_name + ">")  
    var _tmp = tmp[1].split("</" + node_name + ">")  
    return _tmp[0]  
  },
  // object-->string
  raw: function(args) {  
    var keys = Object.keys(args)  
    keys = keys.sort()  
    var newArgs = {}  
    keys.forEach(function(key) {  
        newArgs[key] = args[key]  
    })  
    var string = ''  
    for (var k in newArgs) {  
        string += '&' + k + '=' + newArgs[k]  
    }  
    string = string.substr(1)  
    return string  
  },  
    // 随机字符串产生函数  
  createNonceStr: function() {  
      return Math.random().toString(36).substr(2, 15)  
  },  
  // 时间戳产生函数  
  createTimeStamp: function() {  
      return parseInt(new Date().getTime() / 1000) + ''  
  },
  // 支付md5加密获取sign
  paysignjs: function(appid, nonceStr, package, signType, timeStamp) {  
    var ret = {  
        appId: appid,  
        nonceStr: nonceStr,  
        package: package,  
        signType: signType,  
        timeStamp: timeStamp  
    }  
    var string = this.raw(ret)  
    string = string + '&key=' + key  
    var sign = crypto.createHash('md5').update(string, 'utf8').digest('hex')  
    return sign.toUpperCase()  
  },
  // 统一下单接口加密获取sign
  paysignjsapi: function(appid, attach, body, mch_id, nonce_str, notify_url, openid, out_trade_no, spbill_create_ip, total_fee, trade_type) {  
    var ret = {  
      appid: appid,  
      attach: attach,  
      body: body,  
      mch_id: mch_id,  
      nonce_str: nonce_str,  
      notify_url: notify_url,  
      openid: openid,  
      out_trade_no: out_trade_no,  
      spbill_create_ip: spbill_create_ip,  
      total_fee: total_fee,  
      trade_type: trade_type  
    }  
    var string = this.raw(ret)  
    string = string + '&key=' + key  
    var crypto = require('crypto')  
    var sign = crypto.createHash('md5').update(string, 'utf8').digest('hex')  
    return sign.toUpperCase()  
  },
  // 下单接口
  order: function(attach, body, mch_id, openid, total_fee, notify_url) {
    var bookingNo = 'davdian' + this.createNonceStr() + this.createTimeStamp()
    var deferred = Q.defer()  
    var appid = config.appId  
    var nonce_str = this.createNonceStr()  
    var timeStamp = this.createTimeStamp()  
    var url = "https://api.mch.weixin.qq.com/pay/unifiedorder"  
    var formData = "<xml>"  
    formData += "<appid>" + appid + "</appid>" //appid  
    formData += "<attach>" + attach + "</attach>" //附加数据  
    formData += "<body>" + body + "</body>"  
    formData += "<mch_id>" + mch_id + "</mch_id>" //商户号  
    formData += "<nonce_str>" + nonce_str + "</nonce_str>" //随机字符串,不长于32位。  
    formData += "<notify_url>" + notify_url + "</notify_url>"  
    formData += "<openid>" + openid + "</openid>"  
    formData += "<out_trade_no>" + bookingNo + "</out_trade_no>"  
    formData += "<spbill_create_ip>61.50.221.43</spbill_create_ip>"  
    formData += "<total_fee>" + total_fee + "</total_fee>"  
    formData += "<trade_type>JSAPI</trade_type>"  
    formData += "<sign>" + this.paysignjsapi(appid, attach, body, mch_id, nonce_str, notify_url, openid, bookingNo, '61.50.221.43', total_fee, 'JSAPI') + "</sign>"  
    formData += "</xml>"  
    var self = this
    request({  
      url: url,  
      method: 'POST',  
      body: formData  
    }, function(err, response, body) {  
      if (!err && response.statusCode == 200) {  
        var prepay_id = self.getXMLNodeValue('prepay_id', body.toString("utf-8")) 
        var tmp = prepay_id.split('[')  
        var tmp1 = tmp[2].split(']')  
        //签名  
        var _paySignjs = self.paysignjs(appid, nonce_str, 'prepay_id=' + tmp1[0], 'MD5', timeStamp)  
        var args = {  
          appId: appid,  
          timeStamp: timeStamp,  
          nonceStr: nonce_str,  
          signType: "MD5",  
          package: tmp1[0],  
          paySign: _paySignjs  
        }
        deferred.resolve(args)  
      } else {  
        console.log(body)  
      } 
    })  
    return deferred.promise  
  }
}
复制代码

之后我们封装下单接口:

复制代码
unifiedorder: function (req, res) {
    var body = "测试支付"  
    var openid = "openid"
    var total_fee = 1
    var notify_url = "http://localhost/notify"
    var mch_id = config.shopId
    var attach = "测试"  
    wxpay.order(attach, body, mch_id, openid, total_fee, notify_url)
      .then(function(data){  
        console.log('data--->', data, 123123)
        res.json(data)
      })  
  },
复制代码

然后我们只需要在小程序里面调用这个接口,就会获取到所有的支付需要信息,再掉微信支付即可。

这里说几个小程序支付的坑:

1.统一下单接口是xml(这个不只是小程序,公众号也是),返回值也是xml格式需要自己获取prepay_id,

2.签名算法要带上key,最后要转换成大些

3.微信支付的sign算法也要带上appid(这个不科学,深坑)

4.签名算法一定不要用json拼接key



微信小程序进行微信支付步骤简述

最近开发微信小程序进入到支付阶段,一直以来从事App开发,所以支付流程还是熟记于心的。但是微信小程序的支付就有点奇怪了,应用的创建是在公众号里,但是文档的介绍却在公众号中无法找到直接入口,甚是不解,而...
  • wangsf789
  • wangsf789
  • 2016年12月01日 13:30
  • 19730

微信小程序支付 java

微信小程序支付包含java服务器端示例demo
  • zhourenfei17
  • zhourenfei17
  • 2017年09月01日 09:41
  • 3437

微信小程序支付,微信支付【小白专用】

微信小程序支付,PHP微信小程序支付
  • xieshunhai
  • xieshunhai
  • 2017年06月01日 10:53
  • 5740

小程序微信支付

  • 2017年09月08日 10:59
  • 75KB
  • 下载

微信小程序支付 后端PHP

微信小程序支付 前端后端PHP 代码:比较简单,在对应的支付事件上进行网络请求就好: view_moneysure:function(){ var code = this.data.co...
  • UFO00001
  • UFO00001
  • 2017年07月22日 11:00
  • 6038

微信小程序中实现微信支付

最近做小程序,涉及到微信支付,看了看微信小程序开发文档,尽管之前做过微信支付,还是有点懵逼,不过好在之前研究过,不然真的是无从下手。对比了一下发现,其实小程序中做支付比公众号支付要省事很多,因为不需要...
  • sinat_35861727
  • sinat_35861727
  • 2017年06月24日 17:21
  • 4880

微信小程序第四天(微信小程序支付)

微信小程序支付的前置准备: 1.微信商户平台账号 2.微信小程序账号 3.微信小程序开通支付接口(个人暂时不支持开通支付)前台需要的操作: 1.登录获取code,传给后台 2.获取后台传过来...
  • m0_37479946
  • m0_37479946
  • 2017年04月18日 17:43
  • 1038

微信小程序支付

微信小程序支付第一步 进入小程序,下单,请求下单支付,调用小程序登录API来获取Openid(https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-lo...
  • suxiongwei
  • suxiongwei
  • 2017年02月02日 10:42
  • 7610

微信小程序支付源码 Demo 后台服务端代码

微信小程序支付绕坑指南 步骤 A:小程序向服务端发送商品详情、金额、openid B:服务端向微信统一下单 C:服务器收到返回信息二次签名发回给小程序 D:小程序发起支付 E:服务端收到回调 源代码已...
  • u013824131
  • u013824131
  • 2017年02月12日 15:48
  • 12810

微信小程序:支付系列专辑(开发指南+精品Demo)

微信小程序联盟出品 小程序支付指南: 微信小程序与php 实现微信支付 | 链接 微信小程序---设计支付密码的输入框| 链接 e玩转小程序支付之付款(统一下单)| 链接 小程序支付详解+...
  • rolan1993
  • rolan1993
  • 2017年06月20日 14:09
  • 1492
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:微信小程序篇(微信小程序的支付)
举报原因:
原因补充:

(最多只允许输入30个字)