GithubHelp home page GithubHelp logo

node-tenpay's Issues

运行报错You may need an appropriate loader to handle this file type

npm run dev报以下错误:
Module parse failed: Unexpected token (196:6)
You may need an appropriate loader to handle this file type.
| micropay(params) {
| let pkg = {
| ...params,
| appid: this.appid,
| mch_id: this.mchid,

@ ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/page/reg_order_confirm.vue 33:19-36
@ ./src/page/reg_order_confirm.vue
@ ./src/router/index.js
@ ./src/main.js
@ multi (webpack)-dev-server/client?http://0.0.0.0:

App支付回调实例

请问有 App 支付回调 处理的例子吗 只看到了 中间件相关的 如果 没有中间件 如何处理呢

服务商模式获取微信JSSDK支付参数错误

let result = await api.getPayParams({
      out_trade_no: Date.now(),
      body: '商品简单描述',
      total_fee: '1',
      sub_openid: subOpenid,
      sub_appid: subAppid,
      sub_mch_id: subMchid
});

小程序中调用支付结果错误

{err_desc: "Unable to verify signature", err_code: "-1", errMsg: "requestPayment:fail"}

关于h5支付必需字段scene_info

这边生成的是这样的
image
而官网给出的是这样
<scene_info>{"h5_info": {"type":"IOS","app_name": "王者荣耀","package_name": "com.tencent.tmgp.sgame"}}</scene_info>
请问有什么解决的好办法吗?
谢谢!

扫码支付模式二的支持?

  • 模式二
  • 扫码支付没看到有输入价格的地方,看.net的扫码支付,发现模式二可以提供输入价格
  • 对比.net 的实现来说,扫码支付二 的实现跟 JS支付 和 APP支付 都是 ( 商户后台系统先调用微信支付的统一下单接口,微信后台系统返回链接参数code_url),是否可以提供实现?
   /**
        * 生成直接支付url,支付url有效期为2小时,模式二
        * @param productId 商品ID
        * @return 模式二URL
        */
        public string GetPayUrl(string productId)
        {
            Log.Info(this.GetType().ToString(), "Native pay mode 2 url is producing...");

            WxPayData data = new WxPayData();
            data.SetValue("body", "test");//商品描述
            data.SetValue("attach", "test");//附加数据
            data.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo());//随机字符串
            data.SetValue("total_fee", 1);//总金额
            data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始时间
            data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));//交易结束时间
            data.SetValue("goods_tag", "jjj");//商品标记
            data.SetValue("trade_type", "NATIVE");//交易类型
            data.SetValue("product_id", productId);//商品ID

            WxPayData result = WxPayApi.UnifiedOrder(data);//调用统一下单接口
            string url = result.GetValue("code_url").ToString();//获得统一下单接口返回的二维码链接

            Log.Info(this.GetType().ToString(), "Get native pay mode 2 url : " + url);
            return url;
        }

退款通知,现在支持吗

谢谢分享,请问现在支持退款通知吗,和支付通知的配置一样吗。
提供部分退款通知消息解密的方法。
`// xml 解析
var parseXML = function (xml, callback) {
xml2js.parseString(xml, {
trim: true,
explicitArray: false
}, function (err, result) {
err ? callback(err) : callback(null, result ? result.root : {});
});
};

// 解密
var decrypt = function (text, trade_type) {
var result = '';
if (trade_type == 'APP') {
let key1 = CryptoJS.MD5(partner_key);
result = CryptoJS.AES.decrypt(text, CryptoJS.enc.Utf8.parse(key1), {
mode: CryptoJS.mode.ECB
});
}
return result.toString(CryptoJS.enc.Utf8);
};`

调用api.refund 接口

api.refund({
out_trade_no: order._id,
out_refund_no: refund._id,
total_fee: 1,
refund_fee: 1
})
//值都是正确的
报错
server error { AssertionError [ERR_ASSERTION]: invalid status code: -1
at Object.set status [as status] (D:\document\takeout-api\node_modules\koa\lib\response.js:86:5)
at Object.status (D:\document\takeout-api\node_modules\delegates\index.js:92:31)
at D:\document\takeout-api\middlewares\error-handling.js:9:18
at
at process._tickCallback (internal/process/next_tick.js:188:7)
generatedMessage: false,
name: 'AssertionError [ERR_ASSERTION]',
code: 'ERR_ASSERTION',
actual: undefined,
expected: true,
operator: '==' } { request:
{ method: 'POST',
url: '/order/cancel',
header:
{ host: 'localhost:4000',
connection: 'keep-alive',
'content-length': '33',
pragma: 'no-cache',
'cache-control': 'no-cache',
'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 wechatdevtools/1.02.1806120 MicroMessenger/6.5.7 Language/zh_CN webview/',
origin: 'http://127.0.0.1:26462',
authorization: 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjoiU3N2ZnhpbmRHZWtITXM4cVVQZit2QT09IiwiaWF0IjoxNTI5MDI3NTk0LCJleHAiOjE1MjkyODY3OTR9.Zx7r9-2RQXC02IWsWYiFSh6V4uV243U5xfJvKcQa-zM',
'content-type': 'application/json; charset=UTF-8',
accept: '/',
referer: 'https://servicewechat.com/wx67518436f322a9c4/devtools/page-frame.html',
'accept-encoding': 'gzip, deflate, br' } },
response:
{ status: 404,
message: 'Not Found',
header:
{ 'x-dns-prefetch-control': 'off',
'x-frame-options': 'SAMEORIGIN',
'strict-transport-security': 'max-age=15552000; includeSubDomains',
'x-download-options': 'noopen',
'x-content-type-options': 'nosniff',
'x-xss-protection': '1; mode=block',
vary: 'Origin',
'access-control-allow-origin': 'http://127.0.0.1:26462' } },
app: { subdomainOffset: 2, proxy: false, env: 'development' },
originalUrl: '/order/cancel',
req: '',
res: '',
socket: '' }

支付通知中间件

微信的文档说明:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7&index=8
微信支付通知xml数据中有个result_code字段为FAIL时,表示用户支付未成功。这个未成功的消息,业务服务器应该有权知道。

但是tenpay的支付通知中间件,在这种情况下会返回给微信支付服务器return res.reply('XMLDataError'),暗示业务服务器未收到消息,而不是收到消息。

总感觉这在逻辑上是错的。

付款通知接口

lib\index.js
switch (type) { case 'middleware_refund': if (json.appid !== this.appid) throw new Error('appid不匹配'); if (json.mch_id !== this.mchid) throw new Error('mch_id不匹配'); let key = util.md5(this.partnerKey).toLowerCase(); let info = util.decrypt(json.req_info, key); json.req_info = await util.parseXML(info); break; case 'transfers': if (json.mchid !== this.mchid) throw new Error('mchid不匹配'); break; case 'sendredpack': case 'sendgroupredpack': if (json.wxappid !== this.appid) throw new Error('wxappid不匹配'); if (json.mch_id !== this.mchid) throw new Error('mchid不匹配'); break; case 'gethbinfo': case 'gettransferinfo': if (json.mch_id !== this.mchid) throw new Error('mchid不匹配'); break; default: if (json.appid !== this.appid) throw new Error('appid不匹配'); if (json.mch_id !== this.mchid) throw new Error('mch_id不匹配'); if (json.sign !== this._getSign(json)) throw new Error('sign签名错误'); } return json;

微信官方都没有req_info 这个字段,带req_info 的这行代码报错,怎么回事?

请问支付成功后回调的网址问题, 谢谢

微信支付结果通知 • 中间件

// Express
var middleware = api.middlewareForExpress();
app.use('/xxx', middleware, function (req, res) {
	var payInfo = req.weixin;
})

请问 /xxx 与 notify_url - 支付结果通知回调地址是一致的吗?
谢谢

交易过程中出错之后,直接throw了Error

if (json.return_code !== 'SUCCESS') throw new Error(json.return_msg || 'XMLDataError');
if (type !== 'middleware_refund') {
if (json.result_code !== 'SUCCESS') throw new Error(json.err_code || 'XMLDataError');
}

代码里,交易过程中出错了之后,直接throw了Error,这样json里返回的微信返回却看不到了,是不是直接callback(null, json)返回就好呢,让大家自己来处理这些错误,因为有时候是想要记录这些错误并处理的

哥们,关于微信支付getAppParamsByPrepay function的错误

getAppParamsByPrepay(params) {
let pkg = {
appid: this.appid,
partnerid: this.mchid,
prepayid: params.prepay_id,
package: 'Sign=WXPay',
nonceStr: util.generate(),
timestamp: '' + (Date.now() / 1000 |0)
};
pkg.sign = this._getSign(pkg);
return pkg;
}

这里的nonceStr应该是noncestr。希望改正

server error Error: ORDERPAID

server error Error: ORDERPAID
at Payment._parse (E:\nodeproject\everprint\node_modules_tenpay@2.1.6@tenpay\lib\index.js:74:51)
at
at process._tickCallback (internal/process/next_tick.js:188:7) { request: ~~~~~
这个是已经支付过了的意思吗?是腾讯返回的吗?

scene_id 的 200 金额限制单位是 分 而不是 元

https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3

官方文档并没有写清楚,但是测试时发送大于2元时就已经需要 scene_id 了,毕竟最大红包金额也只是 200 元。或者代码不需要做判断处理,调用时有传入参数则传到接口。

node-tenpay/lib/index.js

Lines 339 to 354 in 8542215

sendRedpack(params) {
let pkg = {
...params,
wxappid: this.appid,
mch_id: this.mchid,
nonce_str: util.generate(),
client_ip: params.client_ip || this.spbill_create_ip,
mch_billno: params.mch_billno || (params.mch_autono ? this.mchid + util.getFullDate() + params.mch_autono : ''),
total_num: params.total_num || 1
};
delete pkg.mch_autono;
let needs = ['mch_billno', 'send_name', 're_openid', 'total_amount', 'wishing', 'act_name', 'remark'];
if (pkg.total_amount >= 20000) needs.push('scene_id');
return this._request(pkg, {type: 'sendredpack', needs, cert: true});
}

另外错误判断只针对特定错误,导致其他出错情况下不会 throw error,比如后台没有配置

{
 "return_msg": "参数错误:该场景未开通,请登陆商户平台:产品中心-现金红包-产品设置-使用场景 进行开通",
  "result_code": "FAIL",
  "err_code": "PARAM_ERROR",
  "err_code_des": "参数错误:该场景未开通,请登陆商户平台:产品中心-现金红包-产品设置-使用场景 进行开通"
}

Todo List

  • 添加沙盒模式
  • 添加微信代金券相关API

promise then 中rs 是不是不需要在判断 return_code,result_code的状态了。

// 申请退款 await api.refund(refund_order).then(rs => { // console.log('>>>>>>退款结果 result is :', JSON.stringify(rs)) if (rs.return_code == 'SUCCESS' && rs.result_code == 'SUCCESS') { // 获取之前充值押金的的价格 const refund_data = { user_id: user_id, wallet_id: wallet_id, out_trade_no: out_trade_no, out_refund_no: out_refund_no, reason: reason, refund_price: order.finally_price } console.log('>>>>>>退款结果1 result is :', JSON.stringify(rs)) // 退款表 return WalletDepositRefundModel.create(refund_data) } }).catch(err => { // 日志 console.log('>>>>>>退款结果3 result is :', JSON.stringify(err)) })

谢谢楼主分享,现在有个小疑问是不是then里面不需要判断 return_code,result_code的状态,都是SUCCESS,所有的错误都在 catch 里面捕捉了。我看了util.js 里面的validate方法,好像需要return_code,result_code 都是SUCCESS才是正确的。我测试了一下也是这样,再来确认下。

XML格式错误

router.post('/', function (req, res, next) {
  let openid = req.body.openid
  let products = req.body.products
  let totalAmount = req.body.totalAmount
  let address = req.body.address
  Customer.findOne({openid:openid}, function(err, customer){
    if(customer){
      let order = new Order({
        user: customer._id,
        phone: customer.phone,
        items: products,
        totalAmount: totalAmount,
        shippingAddress: address,
        status: 'created',
        createdAt: new Date().getTime(),
        updatedAt: new Date().getTime()
      })
      order.save((err, order)=>{
        if(order){
          let result = unifiedOrder(order._id, '服装', totalAmount,customer.openId)
          console.log(result)
          return res.send(result)
       }
     })
    }
  })
})


async function unifiedOrder(orderId, name, totalAmount, openid){
  try {
    let result = await wxpay.unifiedOrder({
      out_trade_no: orderId,
      body: name,
      total_fee: totalAmount,
      openid: openid
    });
    console.log(result)
  } catch (error) {
    console.error(error);
  }
}

Error Console
Promise { <pending> } Error: XML格式错误 at Payment._parse (/Users/haochen/wechat/kunkka/node_modules/tenpay/lib/index.js:43:47) at <anonymous> at process._tickCallback (internal/process/next_tick.js:160:7)

不太清楚那里出错了 才会导致返回xml格式错误?在local做测试时返回的

请教下getPayParams 还能用吗?

大神,上周getPayParams 方法还可以返回支付参数,今天直接返回 INVALID_REQUEST 了,公众号配置也没动过,微信改啥了吗?

npm deprecated warn

npm WARN deprecated [email protected]: If using 2.x branch, please upgrade to at least 2.1.6 to avoid a serious bug with socket data flow and an import issue introduced in 2.1.0

调用refund接口报错

{ResponseError: socket hang up (req "error"), POST https://api.mch.weixin.qq.com/secapi/pay/refund -1 (connected: true, keepalive socket: false)
headers: {}
    at createHangUpError (_http_client.js:331:15)
    at TLSSocket.socketOnEnd (_http_client.js:423:23)
    at emitNone (events.js:111:20)
    at TLSSocket.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickCallback (internal/process/next_tick.js:180:9)
From previous event:
    at Payment.request (C:\project\nextown\nodejs-nextown-api\node_modules\tenpay\lib\index.js:282:10)
    at Payment.refund (C:\project\nextown\nodejs-nextown-api\node_modules\tenpay\lib\index.js:136:15)
    at Finance.refundDispatchOrder (C:\project\nextown\nodejs-nextown-api\src\models\finance.js:40:41)
    at <anonymous>
  code: 'ECONNRESET',
  name: 'ResponseError',
  data: undefined,
  path: '/secapi/pay/refund',
  status: 500,
  headers: {},
  res:
   { status: -1,
     statusCode: 500,
     headers: {},
     size: 0,
     aborted: false,
     rt: 216,
     keepAliveSocket: false,
     data: undefined,
     requestUrls: [ 'https://api.mch.weixin.qq.com/secapi/pay/refund' ],
     timing: null,
     remoteAddress: '182.254.78.168',
     remotePort: 443 } }

在调用退款接口时出现如下错误,请怎么回事啊

tenpay版本:1.1.4
node版本:8.11.1

在调用 transfers API的时候报错

你好,
感谢你这个lib,非常棒 🙏
想要实现企业付款的功能,但是在用 api.transfers的时候遇到一个错误,不知道是什么问题:

config是这样初始化的:

const config = {
  appid: process.env.WX_APP_ID,
  mchid: process.env.WX_MCHID,
  partnerKey: process.env.WX_PAY_SECRET, // 微信商户平台 API secret,非小程序 secret
  notify_url: process.env.WX_NOTIFY_URL,
  pfx: require('fs').readFileSync('./apiclient_cert.pem')
}

const wxpay = WXPay.init(config)

然后在我的routes里面这样使用:

  app.route('/test-transfer')
    .post(async ({ body: { openid, fullname } }, res, next) => {
      const partner_trade_no = _generateOutTradeNo()
      try {
        let result = await wxpay.transfers({
          partner_trade_no,
          openid,
          re_user_name: fullname,
          amount: 1,
          desc: '扫街费'
        })
        console.log(result)
        res.json({ result })
      } catch (error) {
        console.log(error)
        next(error)
      }
    })

返回的错误是这样的:

Error: wrong tag, POST https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers -1 (connected: false, keepalive socket: false) headers: {}

app支付函数编码问题

lib/index.js的182行,getAppParamsByPrepay方法中,微信支付文档的随机字符串字段为:noncestr,而方法中为nonceStr,会导致微信后台在检查签名的时候报错~

_getPayParams 中为什么返回了timeStamp与timestamp 俩个值一样的参数,timestamp有何用?

// JSSDK支付签名(原始方法)
Payment.prototype._getPayParams = function(params, callback) {
var that = this;
that.unifiedOrder(params, function(err, result) {
if (err) return callback(err);
var pkg = Object.assign({}, {
appId: that.appid,
timeStamp: '' + (Date.now() / 1000 |0),
nonceStr: util.generateNonceStr(),
package: 'prepay_id=' + result.prepay_id,
signType: 'MD5'
});
pkg.paySign = that.getSign(pkg);
pkg.timestamp = pkg.timeStamp;
callback(null, pkg);
})
};

body使用中文时签名错误

在计算字符串md5时需要指定编码为utf8
Payment.prototype.getSign = function(pkg) {
pkg = Object.assign({}, pkg);
delete pkg.sign;
var str = ulits.toQueryString(pkg) + '&key=' + this.partnerKey;
return crypto.createHash('md5').update(str, 'utf8').digest('hex').toUpperCase();
};

README.md 里的扫码支付 是不是标错了 ?

micropay: 扫码支付 ? 看 lib/index.js 下的注释。。不像

  // 扫码支付, 生成URL(模式一)
  getNativeUrl(params) {
    let pkg = {
      ...params,
      appid: this.appid,
      mch_id: this.mchid,
      time_stamp: '' + (Date.now() / 1000 |0),
      nonce_str: util.generate()
    };

    let url = 'weixin://wxpay/bizpayurl'
            + '?sign=' + this._getSign(pkg)
            + '&appid=' + pkg.appid
            + '&mch_id=' + pkg.mch_id
            + '&product_id=' + pkg.product_id
            + '&time_stamp=' + pkg.time_stamp
            + '&nonce_str=' + pkg.nonce_str;
    return url;
}

  // 刷卡支付
  micropay(params) {
    let pkg = {
      ...params,
      appid: this.appid,
      mch_id: this.mchid,
      nonce_str: util.generate(),
      sign_type: params.sign_type || 'MD5',
      spbill_create_ip: params.spbill_create_ip || this.spbill_create_ip
    };

    return this._request(pkg, 'micropay');
}

请问这是什么错误?

{"code":-1,"reason":"/data/release/node-weapp-demo/node_modules/tenpay/lib/index.js:52\n ...config,\n ^^^\n\nSyntaxError: Unexpected token ...\n at createScript (vm.js:74:10)\n at Object.runInThisContext (vm.js:"}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.