UNPKG

weixinpay-sdk

Version:

基于微信官方的原生 API 封装而成的 SDK,将官方要求的 xml 格式均通过 sdk 转换成 JSON 格式方便开发,当前已支持 Native

102 lines (95 loc) 3.17 kB
const axios = require('axios') const wxpayTools = require('./utils.js') const EXEC_TYPE = { 'unifiedorder': 'https://api.mch.weixin.qq.com/pay/unifiedorder', // 统一下单 'orderquery': 'https://api.mch.weixin.qq.com/pay/orderquery', // 查询订单 'closeorder': 'https://api.mch.weixin.qq.com/pay/closeorder', // 关闭订单 } let sendHttpRequest = axios.default.create(); // 拦截响应,直接获取 data sendHttpRequest.interceptors.response.use(res => { return res.data; }) /** * 本 sdk 自动依据 key 生成 sgin * 所以无需传入随机字符串 nonce_str 与 签名 sign * 其余参数参照官方文档上传即可 */ class WeiXinPaySdk { /** * * @param { * String:appid, // 公众账号 ID * String:mch_id, // 商户号 * String:key, // 商户平台设置的秘钥 key * } config * @note config 填写指定参数,剩余参数参照官方文档填写即可 */ constructor(config) { this.key = config.key; // 商户私密 api key 切勿泄漏 this.baseConfig = { // 公用属性 appid: config.appid, // 公众号 id mch_id: config.mch_id, // 商户号 } // 异步通知结果 this.notifyOK = `<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>` } /** * @note 发送对应请求接口获取返回结果 * @param {method} String 请求方法,对应 EXEC_TYPE * @param {postData} Object 请求参数 * @returns {JSON} 返回请求结果 */ async exec(method, postData) { // 基础配置添加到请求数据中 Object.assign(postData, this.baseConfig); // 添加随机字符串 postData.nonce_str = wxpayTools.getRandomString(16); // 生成签名 postData.sign = wxpayTools.createSign(postData, this.key); // 转换 xml 格式 let resXml = wxpayTools.objToXmlString(postData); switch (method) { // 统一下单 case 'unifiedorder': { let res = await sendHttpRequest.post(EXEC_TYPE[method], resXml) // 将结果转换为 JSON 对象 res = wxpayTools.xmlToJson(res) return res; } case 'orderquery': { let res = await sendHttpRequest.post(EXEC_TYPE[method], resXml) // 将结果转换为 JSON 对象 res = wxpayTools.xmlToJson(res) return res; } case 'closeorder': { let res = await sendHttpRequest.post(EXEC_TYPE[method], resXml) // 将结果转换为 JSON 对象 res = wxpayTools.xmlToJson(res) return res; } } // 如果不存在,则返回错误代码 return { code: 404, msg: '请求不存在!' } } /** * * @param {JSON} reqData 支付成功后的异步通知请求参数 * @return {Boolean} 返回验证是否成功 */ checkSign(reqData) { let { sign: reqSign } = reqData; let mySign = wxpayTools.createSign(reqData, this.key, ['sign']); if (mySign === reqSign) { return true; } return false } } module.exports = WeiXinPaySdk;