index.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. var https = require('https');
  2. var crypto = require('crypto');
  3. var querystring = require('querystring');
  4. /**
  5. * alipay_gateway 支付宝默认网关
  6. * _input_charset 字符编码格式
  7. * sign_type 签名加密方式
  8. */
  9. var basicConfig = {
  10. alipay_gateway: 'https://mapi.alipay.com/gateway.do?',
  11. _input_charset: 'UTF-8',
  12. sign_type: 'MD5',
  13. service: 'alipay.wap.create.direct.pay.by.user'
  14. };
  15. /**
  16. * https GET 对应的url
  17. * @param url @param url 要请求的url
  18. * @returns {Promise}
  19. */
  20. // function httpsGET(url) {
  21. // return new Promise(function (resolve, reject) {
  22. // var req = https.get(url, function (res) {
  23. // res.on('data', function (data) {
  24. // resolve(data);
  25. // });
  26. // });
  27. // req.on('error', function (err) {
  28. // reject(err);
  29. // });
  30. // req.end();
  31. // });
  32. // }
  33. /**
  34. * 计算签名
  35. * @param json
  36. * @returns {string}
  37. */
  38. function buildSign(json) {
  39. var keys = Object.keys(json);
  40. keys = keys.sort();
  41. var map = {};
  42. for (var i = 0; i < keys.length; i++) {
  43. var key = keys[i];
  44. if (key !== 'sign' && key !== 'sign_type' && json[key]) {
  45. map[key] = json[key];
  46. }
  47. }
  48. var str = querystring.unescape(querystring.stringify(map)) + basicConfig.key;
  49. return crypto.createHash(basicConfig.sign_type).update(str, basicConfig._input_charset).digest('hex');
  50. }
  51. /**
  52. * 配置
  53. * @param params
  54. * {
  55. * seller_email:签约支付宝账号或卖家收款支付宝帐户
  56. * partner:合作身份者ID,以2088开头由16位纯数字组成的字符串
  57. * key:交易安全检验码,由数字和字母组成的32位字符串
  58. * notify_url:支付宝服务器通知的页面
  59. * return_url:支付后跳转后的页面
  60. * }
  61. */
  62. exports.config = function (params) {
  63. Object.assign(basicConfig, params);
  64. };
  65. /**
  66. * 使用订单参数构造一个支付请求
  67. * @param orderParams 订单参数
  68. * {
  69. * body:订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里
  70. * out_trade_no:你的网站订单系统中的唯一订单号匹配
  71. * subject:订单名称显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。
  72. * total_fee:订单总金额,显示在支付宝收银台里的“应付总额”里
  73. * service: 电脑支付create_direct_pay_by_user 手机支付alipay.wap.create.direct.pay.by.user
  74. * }
  75. * @returns {string} 支付宝支付请求URL 浏览器跳转到该url支付
  76. */
  77. exports.buildDirectPayURL = function (orderParams) {
  78. var json = {
  79. service: 'create_direct_pay_by_user',
  80. payment_type: '1',
  81. _input_charset: basicConfig._input_charset,
  82. notify_url: basicConfig.notify_url,
  83. partner: basicConfig.partner,
  84. return_url: basicConfig.return_url,
  85. seller_email: basicConfig.seller_email
  86. };
  87. Object.assign(json, orderParams);
  88. //加入签名结果与签名方式
  89. json.sign = buildSign(json);
  90. json.sign_type = basicConfig.sign_type;
  91. return basicConfig.alipay_gateway + querystring.stringify(json);
  92. };
  93. /**
  94. * 验证来自支付宝的通知是否合法
  95. * @param params 来自支付宝的通知参数
  96. * @returns {Promise} 验证通过时resolve,失败时reject
  97. */
  98. // exports.verify = function (params) {
  99. // return new Promise(function (resolve, reject) {
  100. // var paramsSign = params.sign;
  101. // var realSign = buildSign(params);
  102. // if (paramsSign === realSign) {
  103. // var url = basicConfig.alipay_gateway +
  104. // querystring.stringify({
  105. // service: 'notify_verify',
  106. // partner: basicConfig.partner,
  107. // notify_id: params['notify_id']
  108. // });
  109. // httpsGET(url).then(function (data) {
  110. // if (data.toString() === 'true') {
  111. // resolve(true);
  112. // } else {
  113. // reject('来自alipay接口的结果为:验证结果不合法');
  114. // }
  115. // }).catch(function (err) {
  116. // reject('请求alipay接口发生网络错误:' + JSON.stringify(err))
  117. // });
  118. // } else {
  119. // reject('sign验证不相等: ' + paramsSign + ' !== ' + realSign);
  120. // }
  121. // });
  122. // };