node-easywechat
node-easywechat copied to clipboard
handlePaid应该返回什么数据
$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访问的
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 });
})
这个更新的代码我单独跑是可以更新到的,但是在回调这里更新不了,我在回调里试了this.ctx.model.payments.findone,可以查询到数据
最后的 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();
是不是回调函数里面返回true时,才执行
const response = await server.serve();
ctx.type = response.getHeader('content-type');
ctx.body = response.getBody();
如果回调是false。那就不执行上面这个response的代码