最近做了一个基于cocos creator的棋牌游戏项目,在跨平台发布,接入微信支付的时候,遇到了这样的一个奇怪的问题.
现象描述:
1.同样的服务端业务逻辑,客户端想服务端请求预支付数据,客户端直接使用服务端接收的预支付信息,调起微信sdk的支付功能.
2.cocos调用支付接口:
if(cc.sys.os==cc.sys.OS_ANDROID) {
jsb.reflection.callStaticMethod(this.ANDROID_API,"goToWXPay","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V",partnerid,prepayId,nonceStr,packages,sign,timeStamp);
}elseif(cc.sys.os==cc.sys.OS_IOS) {jsb.reflection.callStaticMethod(this.IOS_API,"goToWXPay:prepayid:noncestr:stamp:package:sign:",partnerid,prepayId,nonceStr,timeStamp,packages,sign);
}
传入的参数值完全相同,结果是安卓版支付正常,ios的老是包签名错误.
问题排查:
1.总共就6个参数,一个个的核对.
2.最终锁定问题,时间戳传入ios的后,值竟然改变了.
那么问题是怎么来的呢?
我查看了cocos的官方文档:
在 OC 的实现中,如果方法的参数需要使用 float、int、bool 的,请使用如下类型进行转换:
float,int 请使用NSNumber类型
bool 请使用 BOOL 类型
目前参数和返回值支持int, float, bool, string,其余的类型暂时不支持。
服务端获得的时间戳是一个整数,于是我用NSNumber,但是发现微信的sdk要求的时间戳
/**时间戳,防重发*/
@property(nonatomic,assign)UInt32 timeStamp;
于是就需要UInt32进行强制转换,于是问题就来了,服务端传来的一个int值,转成NSNumber再转成UInt32,值就变了,所以就导致了签名验证总是出错的问题.
解决方案:
为了避免转换出现的问题,我选择了将服务端时间戳直接转换成string类型,传入ios的接口,然后再ios中强制转换字符串为UInt32
req.timeStamp= (UInt32)[stampintValue];
自此,问题解决.