美文网首页Cocos Creator
cocos游戏ios端接入微信支付的坑

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

作者: 暴走码农 | 来源:发表于2017-08-24 19:28 被阅读102次

    最近做了一个基于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端接入微信支付的坑

        本文链接:https://www.haomeiwen.com/subject/zuoedxtx.html