Rumah hujung hadapan web tutorial js nodejs如何实现微信支付

nodejs如何实现微信支付

Apr 14, 2018 am 10:42 AM
javascript nodejs bayar

这次给大家带来nodejs如何实现微信支付,nodejs实现微信支付的注意事项有哪些,下面就是实战案例,一起来看一下。

通过nodejs使用微信支付最重要的就是微信的签名,在这里md5后的字符必须转化为大写

一、回复微信通知消息模版

message.ejs

1

2

3

4

<xml> 

  <return_code><![CDATA[<%-return_code%>]]></return_code> 

  <return_msg><![CDATA[<%=return_msg%>]]></return_msg> 

</xml>

Salin selepas log masuk

二、微信支付model文件代码

wxpay.js

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

var config = require('../config'); //配置文件 appid 等信息 

var Q = require("q"); 

var request = require("request"); 

var crypto = require('crypto'); 

var ejs = require('ejs'); 

var fs = require('fs'); 

var key = "此处为申请微信支付的API密码"

var messageTpl = fs.readFileSync(dirname + '/message.ejs''utf-8'); 

  

var WxPay = { 

  getXMLNodeValue: function(node_name, xml) { 

    var tmp = xml.split("<" + node_name + ">"); 

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

    return _tmp[0]; 

  }, 

  

  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; 

  }, 

  

  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(); 

  }, 

  

  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; //key为在微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 

    var crypto = require('crypto'); 

    var sign = crypto.createHash('md5').update(string, 'utf8').digest('hex'); 

    return sign.toUpperCase(); 

  }, 

  

  // 随机字符串产生函数 

  createNonceStr: function() { 

    return Math.random().toString(36).substr(2, 15); 

  }, 

  

  // 时间戳产生函数 

  createTimeStamp: function() { 

    return parseInt(new Date().getTime() / 1000) + ''

  },

Salin selepas log masuk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

// 此处的attach不能为空值 否则微信提示签名错误 

  order: function(attach, body, mch_id, openid, bookingNo, total_fee, notify_url) { 

    var deferred = Q.defer(); 

    var appid = config.member_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) { 

        console.log(body); 

        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; 

  }, 

  

  //支付回调通知 

  notify: function(obj) { 

    var output = ""

    if (obj.return_code == "SUCCESS") { 

      var reply = { 

        return_code: "SUCCESS"

        return_msg: "OK" 

      }; 

  

    else 

      var reply = { 

        return_code: "FAIL"

        return_msg: "FAIL" 

      }; 

    

  

    output = ejs.render(messageTpl, reply); 

    return output; 

  }, 

}; 

module.exports = WxPay;

Salin selepas log masuk

三、在express router中调用wxpay

1

2

3

4

5

6

7

8

9

10

11

12

13

//微信支付demo 

router.get('/order'function(req, res, next){ 

  var attach = "1276687601"

  var body = "测试支付"

  var mch_id = "1111111"; //商户ID 

  var openid = "111111"

  var bookingNo = "201501806125346"; //订单号 

  var total_fee = 10; 

  var notify_url = "http://localhost/wxpay/notify"; //通知地址 

  wxpay.order(attach, body, mch_id, openid, bookingNo, total_fee, notify_url).then(function(data){ 

    res.render('wxpay', {args: data}); 

  }); 

});

Salin selepas log masuk

1

2

3

4

//微信回调通知 采用数据流形式读取微信返回的xml数据 此处不在累赘 

router.post('/notify'function(req, res, next){ 

  

});

Salin selepas log masuk

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

JS操作TXT文本在指定位置插入内容

JS做出移动端触摸轮播效果

Atas ialah kandungan terperinci nodejs如何实现微信支付. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Perbezaan antara nodejs dan tomcat Perbezaan antara nodejs dan tomcat Apr 21, 2024 am 04:16 AM

Perbezaan antara nodejs dan tomcat

Perbezaan antara nodejs dan vuejs Perbezaan antara nodejs dan vuejs Apr 21, 2024 am 04:17 AM

Perbezaan antara nodejs dan vuejs

Adakah nodejs rangka kerja bahagian belakang? Adakah nodejs rangka kerja bahagian belakang? Apr 21, 2024 am 05:09 AM

Adakah nodejs rangka kerja bahagian belakang?

Apakah perbezaan antara fail npm dan npm.cmd dalam direktori pemasangan nodejs? Apakah perbezaan antara fail npm dan npm.cmd dalam direktori pemasangan nodejs? Apr 21, 2024 am 05:18 AM

Apakah perbezaan antara fail npm dan npm.cmd dalam direktori pemasangan nodejs?

Adakah nodejs bahasa pembangunan bahagian belakang? Adakah nodejs bahasa pembangunan bahagian belakang? Apr 21, 2024 am 05:09 AM

Adakah nodejs bahasa pembangunan bahagian belakang?

Apakah pembolehubah global dalam nodejs Apakah pembolehubah global dalam nodejs Apr 21, 2024 am 04:54 AM

Apakah pembolehubah global dalam nodejs

Adakah terdapat perbezaan besar antara nodejs dan java? Adakah terdapat perbezaan besar antara nodejs dan java? Apr 21, 2024 am 06:12 AM

Adakah terdapat perbezaan besar antara nodejs dan java?

Mana satu untuk dipilih antara nodejs dan java? Mana satu untuk dipilih antara nodejs dan java? Apr 21, 2024 am 04:40 AM

Mana satu untuk dipilih antara nodejs dan java?

See all articles