unity3d 微信支付 for IOS

来源:互联网 发布:淘宝商品网页无法显示 编辑:程序博客网 时间:2024/06/07 08:55

本人 unity3D 开发 因项目 需要 接入 微信 支付, 步步填坑。和大家风险下 坑经验!

因为这边服务器暂时没有到位。 所以 一切处理 都是在客户端完成!

首先感谢这个这位博主:http://www.jianshu.com/p/94dcc220b2aa

主要的几个文件 给大家分享下!


1.初始化 微信参数 info 从unity 传过来 

// C函数  UNity3d 调用具体实现//**********************************void _startUp(char* info){    [NativeIOSManager instance];        //NSLog(@"传来的参数:>>%s",info);        NSString *initInfo = [NSString stringWithUTF8String:info];    NSDictionary *dic  = [iOSManager dictionaryWithJsonString:initInfo];    if( dic != nil )    {        iOSManager.WX_AppID             = dic[@"AppID"];        iOSManager.WX_MCHID             = dic[@"MCH_ID"];        iOSManager.WX_APP_Secret        = dic[@"APP_Secret"];        iOSManager.WX_AppKey            = dic[@"APP_Key"];        iOSManager.WX_PayArticleInfo    = dic[@"weChatPayArticleInfo"];        iOSManager.WX_PayArticleCheck   = dic[@"weChatPayArticleCheck"];                [WXApi registerApp: iOSManager.WX_AppID];        NSLog(@"注册微信......");            }else    {        NSLog(@"参数赋值失败");        [iOSManager ResoultWeChatPayFail:@"初始化失败"];    }        //    NSLog(@"iOSManager.WX_AppID:%@",            iOSManager.WX_AppID);    //    NSLog(@"iOSManager.WX_MCHID:%@",            iOSManager.WX_MCHID);    //    NSLog(@"iOSManager.WX_APP_Secret:%@",       iOSManager.WX_APP_Secret);    //    NSLog(@"iOSManager.WX_AppKey:%@",           iOSManager.WX_AppKey);    //    NSLog(@"iOSManager.WX_PayArticleInfo:%@",   iOSManager.WX_PayArticleInfo);    //    NSLog(@"iOSManager.WX_PayArticleCheck:%@",  iOSManager.WX_PayArticleCheck);    }

2. 这一步是构造 统一下单的 数据   其中的参数 我有项目的参数 大家不用删掉就好

 

void _WechatPay(char* gameid, char* articleid){    if( [WXApi isWXAppSupportApi]  != 0)    {        iOSManager.WX_GameID        = [NSString stringWithUTF8String:gameid];        iOSManager.WX_ArticledID    = [NSString stringWithUTF8String:articleid];                NSString *urlTag = [NSString stringWithFormat:@"%@GameID=%@&ProductID=%@", iOSManager.WX_PayArticleInfo, iOSManager.WX_GameID,iOSManager.WX_ArticledID ];                NSLog(@"urlTag:%@",urlTag);                NSURL       *url        = [NSURL URLWithString:urlTag];        NSError     *err        = nil;        NSString    *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error: &err];                NSLog(@"App服务器返回:%@",jsonString);                if( jsonString !=nil )        {                        NSDictionary *dic = [iOSManager dictionaryWithJsonString:jsonString];                        if( dic != nil )            {                iOSManager.WX_Noncestr   = dic[@"SjNumber"];                iOSManager.WX_OutTradNO  = dic[@"OrderID"];                iOSManager.WX_PrduceName = dic[@"ProductName"];                iOSManager.WX_Price      = dic[@"Price"];                //int price = [dic[@"Price"] intValue] *100;                //iOSManager.WX_Price      = [NSString stringWithFormat:@"%d",price];                                DataMD5 *date = [[DataMD5 alloc] initWithAppid:iOSManager.WX_AppID                                                        mch_id:iOSManager.WX_MCHID                                                     nonce_str:iOSManager.WX_Noncestr                                                    partner_id:iOSManager.WX_AppKey                                                          body:@"912YULE"                                                  out_trade_no:iOSManager.WX_OutTradNO                                                     total_fee:iOSManager.WX_Price                                              spbill_create_ip:[getIPhoneIP getIPAddress]                                                    notify_url:@"www.baidu.com"                                                    trade_type:@"APP"];                                NSString* sign = [date getSignForMD5];                                //设置参数并转化成xml格式                NSMutableDictionary *dic = [NSMutableDictionary dictionary];                [dic setValue:iOSManager.WX_AppID forKey:@"appid"];//公众账号ID                [dic setValue:iOSManager.WX_MCHID forKey:@"mch_id"];//商户号                [dic setValue:iOSManager.WX_Noncestr forKey:@"nonce_str"];//随机字符串                [dic setValue:sign forKey:@"sign"];//签名                [dic setValue:@"912YULE" forKey:@"body"];//商品描述                [dic setValue:iOSManager.WX_OutTradNO forKey:@"out_trade_no"];//订单号                [dic setValue:iOSManager.WX_Price forKey:@"total_fee"];//金额                [dic setValue:[getIPhoneIP getIPAddress] forKey:@"spbill_create_ip"];//终端IP                [dic setValue:@"www.baidu.com" forKey:@"notify_url"];//通知地址                [dic setValue:@"APP" forKey:@"trade_type"];//交易类型                // 转换成xml字符串                NSString *string = [dic XMLString];                                [iOSManager getProduceArgs:string];                            }else            {                NSLog(@"与APP服务器通讯出错");                [iOSManager ResoultWeChatPayFail:@"与APP服务器通讯出错!"];            }                                }else        {            NSLog(@"与APP服务器通讯出错");            [iOSManager ResoultWeChatPayFail:@"与APP服务器通讯出错!"];        }    }else    {        [iOSManager ResoultWeChatPayFail:@"微信不支持"];    }}

3.  请求 微信的统一下单。 应为 要用到 post请求 所以 用到了 AFNetWorking 库,

这个库我用的是 3.0 版本的,然后手动添加,添加完成后 需要在 unity 导入到 xcode   修改项目  .pch 文件,以及添加依赖库 参考    参考

#pragma mark   ==============获取统一订单接口==============-(void)getProduceArgs : (NSString *) httpString{    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];    manager.responseSerializer = [[AFHTTPResponseSerializer alloc] init];    [manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];    [manager.requestSerializer setValue:@"https://api.mch.weixin.qq.com/pay/unifiedorder" forHTTPHeaderField:@"SOAPAction"];    [manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {        return httpString;    }];        //NSLog(@"httpString =====>1:%@", httpString);            [manager POST:WXUNIFIEDORDERURL parameters:httpString progress:^(NSProgress * _Nonnull uploadProgress) {    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject)     {         NSString *responseString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding] ;                  NSLog(@"responseString is %@",responseString);         NSDictionary *dic = [NSDictionary dictionaryWithXMLString:responseString];         //判断返回的许可         if ([[dic objectForKey:@"result_code"] isEqualToString:@"SUCCESS"] &&[[dic objectForKey:@"return_code"] isEqualToString:@"SUCCESS"] ) {             //发起微信支付,设置参数             NSLog(@"发起微信支付,设置参数");                                       PayReq *request     = [[PayReq alloc] init];             request.openID      = [dic objectForKey:@"appid"];             request.partnerId   = [dic objectForKey:@"mch_id"];             request.prepayId    = [dic objectForKey:@"prepay_id"];             request.package     = @"Sign=WXPay";             request.nonceStr    = [dic objectForKey:@"nonce_str"];                          iOSManager.WX_Prepay_id = request.prepayId;                                       //将当前事件转化成时间戳             NSDate *datenow     = [NSDate date];             NSString *timeSp    = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]];             UInt32 timeStamp    = [timeSp intValue];             request.timeStamp   = timeStamp;             // 签名加密                          DataMD5 *md5 = [[DataMD5 alloc] initWithAppid:iOSManager.WX_AppID                                                    mch_id:iOSManager.WX_MCHID                                                 nonce_str:iOSManager.WX_Noncestr                                                partner_id:iOSManager.WX_AppKey                                                      body:@"912YULE"                                              out_trade_no:iOSManager.WX_OutTradNO                                                 total_fee:iOSManager.WX_Price                                          spbill_create_ip:[getIPhoneIP getIPAddress]                                                notify_url:@"www.baidu.com"                                                trade_type:@"APP"];                          request.sign    = [md5 createMD5SingForPay:request.openID                                              partnerid:request.partnerId                                               prepayid:request.prepayId                                                package:request.package                                               noncestr:request.nonceStr                                              timestamp:request.timeStamp];             //             // 调用微信             //             NSLog(@"request.openID:%@",     request.openID);             //             NSLog(@"request.partnerId:%@",  request.partnerId);             //             NSLog(@"request.prepayId:%@",   request.prepayId);             //             NSLog(@"request.package:%@",    request.package);             //             NSLog(@"request.nonceStr:%@",   request.nonceStr);             //             NSLog(@"request.timeStamp:%u",  (unsigned int)request.timeStamp);             //             NSLog(@"request.sign:%@",       request.sign);                                       [WXApi sendReq:request];             //[WXApi on]                          //[MBProgressHUD hideHUD];         }else{             //LXLog(@"参数不正确,请检查参数");             //[MBProgressHUD hideHUD];             //[MBProgressHUD showError:@"支付错误!"];             [iOSManager ResoultWeChatPayFail:@"与服务器通讯出错!"];         }                       } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)     {         NSLog(@"error is %@",error);                  [iOSManager ResoultWeChatPayFail:@"与服务器通讯出错!"];     }];    }

然后 unity3D 端






4.后来发现 调起支付 并且完成以后, 微信支付回调 

-(void)onResp:(BaseResp *)resp {
  并没有执行 。 然后 把回调写在了 导出的 xcode 工程的 UnityAppController.mm 中就能回调了参考   http://web.mob.com/faq/?/question/58

头文件




估计不太详细 核心源码:http://download.csdn.net/detail/nicepainkiller/9862138

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 iphone触屏不灵怎么办 平板进水屏幕失灵怎么办 小米平板屏幕失灵怎么办 手机内屏变脏怎么办? 苹果手机屏幕触摸不灵敏怎么办 苹果6触控坏了怎么办 手机触摸屏不好使怎么办 手机触摸屏不好用怎么办 平板触屏不准怎么办 小米手机锁屏键失灵怎么办 三星手机锁屏键失灵怎么办 魅族2屏幕失灵怎么办 屏幕触屏不行怎么办 手机触屏失控怎么办 手机触屏不灵怎么办 电脑触屏不灵敏怎么办 iphone屏坏了怎么办 荣耀手机充电慢怎么办 苹果电池胶拉断怎么办 iphone8耳机丢了怎么办 华为p10进水了怎么办 苹果手机屏幕老是闪怎么办 苹果充电没反应怎么办 6sp开胶了怎么办 夜场ic微信怎么办 手机壳影响信号怎么办 三星开机键失灵怎么办 手机待机键失灵怎么办 手机关机键失灵怎么办 华为开关键失灵怎么办 iphone6plus屏幕碎了怎么办 苹果手机屏幕点不动怎么办 手机屏幕失灵划不动怎么办 苹果手机像素不好怎么办 苹果8指纹不灵敏怎么办 手机摔侧面裂缝怎么办 电脑触摸板进水怎么办 iphone部分屏幕失灵怎么办 苹果屏幕按键不灵怎么办 苹果4s老卡机怎么办 坚果2手机黑屏怎么办