早睡早起,方能养生
Sleep early rise early, way to keep healthy

ThinkPHP5.1使用easywachat做小程序支付,调起支付时提示:支付验证签名失败

super
2021-06-09 11:27
views 3774

 

原代码:

 

$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 条讨论
top