1. // 云函数入口文件
    2. const cloud = require('wx-server-sdk')
    3. cloud.init()
    4. const app = require('tcb-admin-node');
    5. const {
    6. WXPay,
    7. WXPayConstants,
    8. WXPayUtil
    9. } = require('wx-js-utils');
    10. const ip = require('ip');
    11. // 云函数入口函数
    12. exports.main = async (event, context) => {
    13. const wxContext = cloud.getWXContext()
    14. const eventObj = {
    15. event,
    16. openid: wxContext.OPENID,
    17. appid: wxContext.APPID,
    18. unionid: wxContext.UNIONID,
    19. mchId: '1498441482',
    20. key: 'a4169ddae4baaf62f7a1c6f437429eaf',
    21. }
    22. const good = event.good
    23. console.log('232', event)
    24. const wxpays = new WXPay({
    25. appId: eventObj.appid,
    26. mchId: eventObj.mchId,
    27. key: eventObj.key,
    28. timeout: 10000,
    29. signType: WXPayConstants.SIGN_TYPE_MD5,
    30. useSandbox: false // 不使用沙箱环境
    31. })
    32. //支付环节
    33. const openid = eventObj.openid
    34. const curTime = Date.now();
    35. const tradeNo = `${good.goodId}-${curTime}`;
    36. const body = good.goodName;
    37. const spbill_create_ip = ip.address() || '127.0.0.1';
    38. // 云函数暂不支付 http 触发器,因此这里回调 notify_url 可以先随便填。
    39. const notify_url = 'http://www.qq.com'; //'127.0.0.1';
    40. const total_fee = Number(good.price);
    41. const time_stamp = '' + Math.ceil(Date.now() / 1000);
    42. const out_trade_no = `${tradeNo}`; //支付id 即订单id
    43. const sign_type = WXPayConstants.SIGN_TYPE_MD5;
    44. let orderParam = {
    45. body,
    46. spbill_create_ip,
    47. notify_url,
    48. out_trade_no,
    49. total_fee,
    50. openid,
    51. trade_type: 'JSAPI',
    52. timeStamp: time_stamp,
    53. };
    54. // 调用 wx-js-utils 中的统一下单方法
    55. const {
    56. return_code,
    57. ...payData
    58. } = await wxpays.unifiedOrder(orderParam);
    59. console.log('申请支付', out_trade_no )
    60. let order_id = null;
    61. if (return_code === 'SUCCESS' && payData.result_code === 'SUCCESS'){
    62. const sign = WXPayUtil.generateSignature({
    63. appId: eventObj.appid,
    64. nonceStr: payData.nonce_str,
    65. package: `prepay_id=${payData.prepay_id}`,
    66. signType: 'MD5',
    67. timeStamp: time_stamp
    68. }, eventObj.key);
    69. let payDatas = Object.assign(payData, { paySign: sign }, { timeStamp: time_stamp }, { out_trade_no: out_trade_no} )
    70. console.log('支付签名', payDatas )
    71. return payDatas
    72. }
    73. }
    1. {
    2. "name": "pay",
    3. "version": "1.0.0",
    4. "description": "",
    5. "main": "index.js",
    6. "scripts": {
    7. "test": "echo \"Error: no test specified\" && exit 1"
    8. },
    9. "author": "",
    10. "license": "ISC",
    11. "dependencies": {
    12. "wx-server-sdk": "latest",
    13. "ip": "^1.1.5",
    14. "request": "^2.87.0",
    15. "tcb-admin-node": "^1.0.30",
    16. "wx-js-utils": "0.0.4"
    17. }
    18. }