cocos游戏ios端接入微信支付的坑

最近做了一个基于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];

自此,问题解决.

关键字:cocos creator 微信支付 安卓支付OK iOS支付异常

你可能感兴趣的:(cocos游戏ios端接入微信支付的坑)