ThinkPHP5.1使用easywachat做小程序支付,调起支付时提示:支付验证签名失败
super
2021-06-09 11:27
4199
原代码:
$order_info = [];
$config = [];
$app = Factory::payment($config);
$result = $app->order->unify([
'body' => '腾讯充值中心-QQ会员充值',
'out_trade_no' => $order_info['number'],
'total_fee' => 1,
// 'total_fee' => $order_info['total'],
// 'spbill_create_ip' => '123.12.12.123', // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
'notify_url' => 'https://' . $_SERVER['HTTP_HOST'] . '/index/pay/miniNotify', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
'openid' => $open_id,
]);
if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS' && isset($result['prepay_id'])) {
$order_data['address'] = json_decode($order_info['address'], true);
$user_info = Users::init()->where('user_id', $this->userID)->field('sex,superior_id')->find();
$order_data['user_sex'] = $user_info['sex'];
$order_data['superior_phone'] = Users::init()->getPhone($user_info['superior_id']);
success(['pay_data' => $order_data, 'order_data' => $order_data]);
} else {
error($result['err_code_des']);
}
修改后:
$order_info = [];
$config = [];
$app = Factory::payment($config);
$result = $app->order->unify([
'body' => '腾讯充值中心-QQ会员充值',
'out_trade_no' => $order_info['number'],
'total_fee' => 1,
// 'total_fee' => $order_info['total'],
// 'spbill_create_ip' => '123.12.12.123', // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
'notify_url' => 'https://' . $_SERVER['HTTP_HOST'] . '/index/pay/miniNotify', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
'openid' => $open_id,
]);
if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS' && isset($result['prepay_id'])) {
$order_data['address'] = json_decode($order_info['address'], true);
$user_info = Users::init()->where('user_id', $this->userID)->field('sex,superior_id')->find();
$order_data['user_sex'] = $user_info['sex'];
$order_data['superior_phone'] = Users::init()->getPhone($user_info['superior_id']);
// 小程序处理
$config = $app->jssdk->bridgeConfig($result['prepay_id'], false); // 返回数组
success(['pay_data' => $config, 'order_data' => $order_data]);
} else {
error($result['err_code_des']);
}
错误原因:返回给前端的数据是未经过二次签名的。
解决方式:将统一下单返回的prepay_id传入 easywechat 的jssdk->bridgeConfig
方法,返回的二次签名后的数据返回给前端。
// 小程序处理
$config = $app->jssdk->bridgeConfig($result['prepay_id'], false); // 返回数组
文档地址:https://easywechat.com/docs/4.x/payment/jssdk
0 条讨论