1. var base64 = require('/utils/base64_uti.js')
    2. var MD5 = require('/utils/md5.js')
    3. var wechat = {//传给后台的数据用于调起支付
    4. appid: "wx0000000000000000",
    5. customerId: "userId",
    6. discount: 0,
    7. openid: "olq0Z0ZndKmXw8IyKcq1Zh4_otis",
    8. sysMemberId: 5
    9. }
    10. function getPayInfo(success, fail) {
    11. wx.request({
    12. url: 'https://详细的接口地址',
    13. header: {
    14. 'content-type': 'application/x-www-form-urlencoded',
    15. },
    16. method: 'POST',
    17. data: wechat,
    18. success: function(res) {
    19. console.log("状态", res)
    20. if (res.data.state == 2) {
    21. var stra = "appId="+wechat.appid+"&nonceStr=" + res.data.nonce_str + "&package=prepay_id=" + res.data.prepay_id + "&signType=MD5&timeStamp=" + res.data.timeStamp;
    22. //这里时拼接商户平台中设置的key,由于后台返回时经过了简单的编码所以使用base64还原
    23. var strb = stra + "&key=" + base64.decode(res.data.key);
    24. //将数据进行本地签名后用于提交支付
    25. var sign = MD5.hex_md5(strb).toUpperCase();
    26. //使用小程序API开始支付
    27. wx.requestPayment({
    28. 'timeStamp': res.data.timeStamp,
    29. 'nonceStr': res.data.nonce_str,
    30. 'package': 'prepay_id=' + res.data.prepay_id,
    31. 'signType': 'MD5',
    32. 'paySign': sign,
    33. 'success': function(res) {
    34. if (fail instanceof Function)
    35. success("支付成功")
    36. },
    37. 'fail': function(res) {
    38. if (fail instanceof Function)
    39. fail(res)
    40. }
    41. })
    42. }
    43. },
    44. fail: function(res) {
    45. if (fail instanceof Function)
    46. fail(res);
    47. }
    48. })
    49. }
    50. module.exports = {
    51. getPayInfo: getPayInfo
    52. }
    1. <!--index.wxml-->
    2. <view class="container">
    3. <view class="userinfo">
    4. <button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>
    5. <block wx:else>
    6. <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
    7. <text class="userinfo-nickname">{{userInfo.nickName}}</text>
    8. </block>
    9. </view>
    10. <view class="usermotto">
    11. <text class="user-motto">{{motto}}</text>
    12. </view>
    13. <button bindtap="getPayTest">支付测试</button>
    14. </view>
    1. //index.js
    2. //获取应用实例
    3. const app = getApp()
    4. var pay = require("../../config.js")
    5. Page({
    6. data: {
    7. motto: 'Hello World',
    8. userInfo: {},
    9. hasUserInfo: false,
    10. canIUse: wx.canIUse('button.open-type.getUserInfo')
    11. },
    12. //事件处理函数
    13. bindViewTap: function() {
    14. wx.navigateTo({
    15. url: '../logs/logs'
    16. })
    17. },
    18. onLoad: function() {
    19. if (app.globalData.userInfo) {
    20. this.setData({
    21. userInfo: app.globalData.userInfo,
    22. hasUserInfo: true
    23. })
    24. } else if (this.data.canIUse) {
    25. // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
    26. // 所以此处加入 callback 以防止这种情况
    27. app.userInfoReadyCallback = res => {
    28. this.setData({
    29. userInfo: res.userInfo,
    30. hasUserInfo: true
    31. })
    32. }
    33. } else {
    34. // 在没有 open-type=getUserInfo 版本的兼容处理
    35. wx.getUserInfo({
    36. success: res => {
    37. app.globalData.userInfo = res.userInfo
    38. this.setData({
    39. userInfo: res.userInfo,
    40. hasUserInfo: true
    41. })
    42. }
    43. })
    44. }
    45. },
    46. getUserInfo: function(e) {
    47. console.log(e)
    48. app.globalData.userInfo = e.detail.userInfo
    49. this.setData({
    50. userInfo: e.detail.userInfo,
    51. hasUserInfo: true
    52. })
    53. },
    54. getPayTest() {
    55. pay.getPayInfo((res) => {
    56. console.log("微信支付成功", res)
    57. wx.showToast({
    58. title: '微信支付成功',
    59. icon: 'success',
    60. duration: 0,
    61. mask: true
    62. })
    63. //页面跳转或数据加载
    64. }, (err) => {
    65. console.log("微信支付失败", err)
    66. wx.showToast({
    67. title: err.errMsg =='requestPayment:fail cancel'?'用户取消支付': '微信支付失败',
    68. icon: 'loading',
    69. duration: 1500
    70. })
    71. //页面跳转或数据加载
    72. })
    73. }
    74. })

    base64_uti.js

    1. var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    2. var base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 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, -1, -1, -1, -1, -1, -1, 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, -1, -1, -1, -1, -1);
    3. /**
    4. * base64编码
    5. *
    6. * @param {Object}
    7. * str
    8. */
    9. function base64encode(str) {
    10. var str = utf16to8(str)
    11. var out, i, len;
    12. var c1, c2, c3;
    13. len = str.length;
    14. i = 0;
    15. out = "";
    16. while (i < len) {
    17. c1 = str.charCodeAt(i++) & 0xff;
    18. if (i == len) {
    19. out += base64EncodeChars.charAt(c1 >> 2);
    20. out += base64EncodeChars.charAt((c1 & 0x3) << 4);
    21. out += "==";
    22. break;
    23. }
    24. c2 = str.charCodeAt(i++);
    25. if (i == len) {
    26. out += base64EncodeChars.charAt(c1 >> 2);
    27. out += base64EncodeChars.charAt(((c1 & 0x3) << 4)
    28. | ((c2 & 0xF0) >> 4));
    29. out += base64EncodeChars.charAt((c2 & 0xF) << 2);
    30. out += "=";
    31. break;
    32. }
    33. c3 = str.charCodeAt(i++);
    34. out += base64EncodeChars.charAt(c1 >> 2);
    35. out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
    36. out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
    37. out += base64EncodeChars.charAt(c3 & 0x3F);
    38. }
    39. return out;
    40. }
    41. /**
    42. * base64解码
    43. *
    44. * @param {Object}
    45. * str
    46. */
    47. function base64decode(str) {
    48. var c1, c2, c3, c4;
    49. var i, len, out;
    50. len = str.length;
    51. i = 0;
    52. out = "";
    53. while (i < len) {
    54. do {
    55. c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
    56. } while (i < len && c1 == -1);
    57. if (c1 == -1)
    58. break;
    59. do {
    60. c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
    61. } while (i < len && c2 == -1);
    62. if (c2 == -1)
    63. break;
    64. out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
    65. do {
    66. c3 = str.charCodeAt(i++) & 0xff;
    67. if (c3 == 61)
    68. return utf8to16(out);
    69. c3 = base64DecodeChars[c3];
    70. } while (i < len && c3 == -1);
    71. if (c3 == -1)
    72. break;
    73. out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
    74. do {
    75. c4 = str.charCodeAt(i++) & 0xff;
    76. if (c4 == 61)
    77. return utf8to16(out);
    78. c4 = base64DecodeChars[c4];
    79. } while (i < len && c4 == -1);
    80. if (c4 == -1)
    81. break;
    82. out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
    83. }
    84. return utf8to16(out);
    85. }
    86. function utf16to8(str) {
    87. var out, i, len, c;
    88. out = "";
    89. len = str.length;
    90. for (i = 0; i < len; i++) {
    91. c = str.charCodeAt(i);
    92. if ((c >= 0x0001) && (c <= 0x007F)) {
    93. out += str.charAt(i);
    94. } else if (c > 0x07FF) {
    95. out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
    96. out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
    97. out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
    98. } else {
    99. out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
    100. out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
    101. }
    102. }
    103. return out;
    104. }
    105. function utf8to16(str) {
    106. var out, i, len, c;
    107. var char2, char3;
    108. out = "";
    109. len = str.length;
    110. i = 0;
    111. while (i < len) {
    112. c = str.charCodeAt(i++);
    113. switch (c >> 4) {
    114. case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
    115. // 0xxxxxxx
    116. out += str.charAt(i - 1);
    117. break;
    118. case 12: case 13:
    119. // 110x xxxx 10xx xxxx
    120. char2 = str.charCodeAt(i++);
    121. out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
    122. break;
    123. case 14:
    124. // 1110 xxxx 10xx xxxx 10xx xxxx
    125. char2 = str.charCodeAt(i++);
    126. char3 = str.charCodeAt(i++);
    127. out += String.fromCharCode(((c & 0x0F) << 12) |
    128. ((char2 & 0x3F) << 6) |
    129. ((char3 & 0x3F) << 0));
    130. break;
    131. }
    132. }
    133. return out;
    134. // var out, i, len, c;
    135. // var char2, char3;
    136. // out = "";
    137. // len = str.length;
    138. // i = 0;
    139. // while (i < len) {
    140. // c = str.charCodeAt(i++);
    141. // switch (c >> 4) {
    142. // case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
    143. // // 0xxxxxxx
    144. // out += str.charAt(i - 1);
    145. // break;
    146. // case 12: case 13:
    147. // // 110x xxxx  10xx xxxx
    148. // char2 = str.charCodeAt(i++);
    149. // out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
    150. // break;
    151. // case 14:
    152. // // 1110 xxxx 10xx xxxx 10xx xxxx
    153. // char2 = str.charCodeAt(i++);
    154. // char3 = str.charCodeAt(i++);
    155. // out += String.fromCharCode(((c & 0x0F) << 12) |
    156. // ((char2 & 0x3F) << 6) |
    157. // ((char3 & 0x3F) << 0));
    158. // break;
    159. // }
    160. // }
    161. // return out;
    162. }
    163. module.exports = {
    164. encode: base64encode,
    165. decode: base64decode,
    166. utf8to16: utf8to16,
    167. utf16to8: utf16to8,
    168. }

    md5.js

    1. var hexcase = 0;
    2. var b64pad = "";
    3. var chrsz = 8;
    4. function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
    5. function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
    6. function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
    7. function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
    8. function calcMD5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
    9. function md5_vm_test()
    10. {
    11. return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
    12. }
    13. function core_md5(x, len)
    14. {
    15. x[len >> 5] |= 0x80 << ((len) % 32);
    16. x[(((len + 64) >>> 9) << 4) + 14] = len;
    17. var a = 1732584193;
    18. var b = -271733879;
    19. var c = -1732584194;
    20. var d = 271733878;
    21. for(var i = 0; i < x.length; i += 16)
    22. {
    23. var olda = a;
    24. var oldb = b;
    25. var oldc = c;
    26. var oldd = d;
    27. a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
    28. d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
    29. c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
    30. b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
    31. a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
    32. d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
    33. c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
    34. b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
    35. a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
    36. d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
    37. c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
    38. b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
    39. a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
    40. d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
    41. c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
    42. b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
    43. a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
    44. d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
    45. c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);
    46. b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
    47. a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
    48. d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
    49. c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
    50. b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
    51. a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
    52. d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
    53. c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
    54. b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
    55. a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
    56. d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
    57. c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
    58. b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
    59. a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
    60. d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
    61. c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
    62. b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
    63. a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
    64. d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
    65. c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
    66. b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
    67. a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
    68. d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
    69. c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
    70. b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
    71. a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
    72. d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
    73. c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);
    74. b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
    75. a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
    76. d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
    77. c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
    78. b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
    79. a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
    80. d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
    81. c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
    82. b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
    83. a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
    84. d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
    85. c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
    86. b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
    87. a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
    88. d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
    89. c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
    90. b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
    91. a = safe_add(a, olda);
    92. b = safe_add(b, oldb);
    93. c = safe_add(c, oldc);
    94. d = safe_add(d, oldd);
    95. }
    96. return Array(a, b, c, d);
    97. }
    98. function md5_cmn(q, a, b, x, s, t)
    99. {
    100. return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
    101. }
    102. function md5_ff(a, b, c, d, x, s, t)
    103. {
    104. return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
    105. }
    106. function md5_gg(a, b, c, d, x, s, t)
    107. {
    108. return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
    109. }
    110. function md5_hh(a, b, c, d, x, s, t)
    111. {
    112. return md5_cmn(b ^ c ^ d, a, b, x, s, t);
    113. }
    114. function md5_ii(a, b, c, d, x, s, t)
    115. {
    116. return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
    117. }
    118. function core_hmac_md5(key, data)
    119. {
    120. var bkey = str2binl(key);
    121. if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
    122. var ipad = Array(16), opad = Array(16);
    123. for(var i = 0; i < 16; i++)
    124. {
    125. ipad[i] = bkey[i] ^ 0x36363636;
    126. opad[i] = bkey[i] ^ 0x5C5C5C5C;
    127. }
    128. var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
    129. return core_md5(opad.concat(hash), 512 + 128);
    130. }
    131. function safe_add(x, y)
    132. {
    133. var lsw = (x & 0xFFFF) + (y & 0xFFFF);
    134. var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
    135. return (msw << 16) | (lsw & 0xFFFF);
    136. }
    137. function bit_rol(num, cnt)
    138. {
    139. return (num << cnt) | (num >>> (32 - cnt));
    140. }
    141. function str2binl(str)
    142. {
    143. var bin = Array();
    144. var mask = (1 << chrsz) - 1;
    145. for(var i = 0; i < str.length * chrsz; i += chrsz)
    146. bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
    147. return bin;
    148. }
    149. function binl2hex(binarray)
    150. {
    151. var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
    152. var str = "";
    153. for(var i = 0; i < binarray.length * 4; i++)
    154. {
    155. str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
    156. hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF);
    157. }
    158. return str;
    159. }
    160. function binl2b64(binarray)
    161. {
    162. var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    163. var str = "";
    164. for(var i = 0; i < binarray.length * 4; i += 3)
    165. {
    166. var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16)
    167. | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
    168. | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
    169. for(var j = 0; j < 4; j++)
    170. {
    171. if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
    172. else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
    173. }
    174. }
    175. return str;
    176. }
    177. module.exports = {
    178. hex_md5:hex_md5,
    179. hex_hmac_md5:hex_hmac_md5,
    180. }

    ulti.js

    1. const formatTime = date => {
    2. const year = date.getFullYear()
    3. const month = date.getMonth() + 1
    4. const day = date.getDate()
    5. const hour = date.getHours()
    6. const minute = date.getMinutes()
    7. const second = date.getSeconds()
    8. return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
    9. }
    10. const formatNumber = n => {
    11. n = n.toString()
    12. return n[1] ? n : '0' + n
    13. }
    14. module.exports = {
    15. formatTime: formatTime
    16. }