hpyer / node-easywechat

EasyWeChat for Node.js
MIT License
138 stars 18 forks source link

handlePaid应该返回什么数据 #85

Closed QC2168 closed 2 months ago

QC2168 commented 2 months ago
$server = $app->getServer();
$server->handlePaid(function (Message $message, \Closure $next) {
    // $message->out_trade_no 获取商户订单号
    // $message->payer['openid'] 获取支付者 openid
    // 🚨🚨🚨 注意:推送信息不一定靠谱哈,请务必验证
    // 建议是拿订单号调用微信支付查询接口,以查询到的订单状态为准
    return $next($message);
});

// 默认返回 ['code' => 'SUCCESS', 'message' => '成功']
return $server->serve();

这个是php的代码,在node中我现在接口返回的是ctx.body = server.serve(),不知道是否正确

另外我发现一个问题,我在handlePaid函数里面进行模型update数据并不生效,是因为回调的问题吗,我是使用箭头函数,this应该是能2访问的

QC2168 commented 2 months ago
await server.handlePaid(async data => {
  const orderNumber = data.out_trade_no;
  const payerOpenid = data.payer.openid;
  const payNumber = data.transaction_id;
  // 这里可以访问到数据
  console.log({
    orderNumber,
    payerOpenid,
    payNumber
  });
  // 获取订单,并把交易状态改为已完成
  // ! 这里无法使用,无报错无警告
  const check = await this.ctx.model.Payments.update({
    paymentStatus: 1,
    openid: payerOpenid,
    payNumber
  }, {
    where: {
      orderNumber
    }
  })
// check也不打印
  console.log({ check });
})
QC2168 commented 2 months ago

这个更新的代码我单独跑是可以更新到的,但是在回调这里更新不了,我在回调里试了this.ctx.model.payments.findone,可以查询到数据

hpyer commented 2 months ago

最后的 console.log({ check }); 不打印,说明前面的 update 操作报错了,你可以 try catch 看下错误原因。sdk包执行的时候,如果捕获到未处理的错误,会认为业务处理失败。

handlePaid 本身不执行闭包,闭包里 return true 表示业务处理成功,微信也就不会再重推消息。

server.serve()的时候才是真的执行,它执行完会返回一个 Response 对象,你需要把对象的内容输出。如:

const server = app.getServer();

server.handlePaid(async message => {
  // ...
  return true; // 也可以不返回,只要闭包不报错,就认为业务处理成功。
});

const response = await server.serve();

ctx.type = response.getHeader('content-type');
ctx.body = response.getBody();
QC2168 commented 2 months ago

是不是回调函数里面返回true时,才执行

const response = await server.serve();

ctx.type = response.getHeader('content-type');
ctx.body = response.getBody();

如果回调是false。那就不执行上面这个response的代码