v2 MD5/SHA256 都没问题,v3 能成功创建订单且能调起支付,但微信会提示签名错误
根据微信文档仅对 appid
、noncestr
、prepayid
、timestamp
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 挺迷的,像 timeStamp
、signType
等参数为什么是微信小程序独有不能合着放到 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;
}
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