MMaxSkyy
MMaxSkyy
  • 发布:2022-11-12 00:23
  • 更新:2022-11-14 09:22
  • 阅读:701

微信支付 v3 RSA 签名调起支付签名错误问题

分类:uni-app

v2 MD5/SHA256 都没问题,v3 能成功创建订单且能调起支付,但微信会提示签名错误

根据微信文档仅对 appidnoncestrprepayidtimestamp 4 个参数进行签名,同时尝试过全参数签名,都会提示签名错误。

望提供解决方案

/**  
 * @param string $prepay_id  
 *  
 * @return array  
 */  
private function getAppOrderDataV3(string $prepay_id): array {  
    $params = [  
        'appid' => $this->app_id,  
        'noncestr' => Formatter::nonce(),  
        'prepayid' => $prepay_id,  
        'timestamp' => (string)Formatter::timestamp()  
    ];  

    $params['sign'] = Rsa::sign(Formatter::joinedByLineFeed(...array_values($params)), $this->mch_pri_key_inst);  

    $params['partnerid'] = $this->mch_id;  
    $params['package'] = 'Sign=WXPay';  

    return $params;  
}

另外 PaymentOptions 挺迷的,像 timeStampsignType 等参数为什么是微信小程序独有不能合着放到 orderInfo 呢?

interface RequestPaymentOptions {  
    /**  
     * 支付服务提供商,通过 uni.getProvider 获取  
     * - alipay: 支付宝支付  
     * - wxpay: 微信支付  
     * - baidu: 百度收银台  
     * - appleiap: 苹果应用内支付  
     */  
    provider: 'alipay' | 'wxpay' | 'baidu' | 'appleiap';  
    /**  
     * 订单数据  
     */  
    orderInfo: string;  
    /**  
     * 时间戳从1970年1月1日至今的秒数,即当前的时间,微信小程序独有  
     */  
    timeStamp?: string;  
    /**  
     * 随机字符串,长度为32个字符以下,微信小程序独有 。  
     */  
    nonceStr?: string;  
    /**  
     * 统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=xx,微信小程序独有  
     */  
    package?: string;  
    /**  
     * 签名算法,暂支持 MD5 ,微信小程序独有  
     */  
    signType?: string;  
    /**  
     * 签名,具体签名方案参见小程序支付接口文档,微信小程序独有  
     */  
    paySign?: string;  
    /**  
     * 接口调用成功的回调函数  
     */  
    success?: (result: any) => void;  
    /**  
     * 接口调用失败的回调函数  
     */  
    fail?: (result: any) => void;  
    /**  
     * 接口调用结束的回调函数(调用成功、失败都会执行)  
     */  
    complete?: (result: any) => void;  
}  
2022-11-12 00:23 负责人:无 分享
已邀请:
BoredApe

BoredApe - 有问题就会有答案。

后台在给APP准备参数的时候,需要进行两次签名:
第一次是发送统一下单请求之前,对发送给微信的所有参数进行签名;
第二次是微信返回预支付交易会话标识后,对传给前端的所有参数进行签名;

  • MMaxSkyy (作者)

    用的微信官方提供的 SDK:wechatpay/wechatpay,我已经提到能够正常创建订单并返回 prepayid,现在的问题是返回给前端参数签名问题。返回的参数能够让 App 调起微信支付,但微信上提示签名错误。


    微信文档描述的是 使用字段appId、timeStamp、nonceStr、prepayid计算得出的签名值,链接:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_4.shtml


    对于这个参数签名,我分别尝试过所有参数以及文档的 4 个参数均提示签名错误。

    2022-11-15 03:50

  • 3***@qq.com

    回复 MMaxSkyy: V3 不用两次签名吧 我现在也是这样的问题

    2022-11-28 13:18

  • 3***@qq.com

    V3版本也要2次签名吗

    2022-11-28 13:18

  • MMaxSkyy (作者)

    回复 3***@qq.com: 没有两次签名,我放弃了,有可能是 UniApp 不兼容导致,先暂时使用 v2,后续有解决方案了再说

    2022-11-30 21:21

该问题目前已经被锁定, 无法添加新回复