unity3d 微信支付 for IOS

http://blog.youkuaiyun.com/nicepainkiller/article/details/72876754

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

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

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

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


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

[html]  view plain  copy
  1. // C函数  UNity3d 调用具体实现  
  2. //**********************************  
  3.   
  4. void _startUp(char* info)  
  5. {  
  6.     [NativeIOSManager instance];  
  7.       
  8.     //NSLog(@"传来的参数:>>%s",info);  
  9.       
  10.     NSString *initInfo = [NSString stringWithUTF8String:info];  
  11.     NSDictionary *dic  = [iOSManager dictionaryWithJsonString:initInfo];  
  12.     if( dic != nil )  
  13.     {  
  14.         iOSManager.WX_AppID             = dic[@"AppID"];  
  15.         iOSManager.WX_MCHID             = dic[@"MCH_ID"];  
  16.         iOSManager.WX_APP_Secret        = dic[@"APP_Secret"];  
  17.         iOSManager.WX_AppKey            = dic[@"APP_Key"];  
  18.         iOSManager.WX_PayArticleInfo    = dic[@"weChatPayArticleInfo"];  
  19.         iOSManager.WX_PayArticleCheck   = dic[@"weChatPayArticleCheck"];  
  20.           
  21.         [WXApi registerApp: iOSManager.WX_AppID];  
  22.         NSLog(@"注册微信......");  
  23.           
  24.     }else  
  25.     {  
  26.         NSLog(@"参数赋值失败");  
  27.         [iOSManager ResoultWeChatPayFail:@"初始化失败"];  
  28.     }  
  29.       
  30.     //    NSLog(@"iOSManager.WX_AppID:%@",            iOSManager.WX_AppID);  
  31.     //    NSLog(@"iOSManager.WX_MCHID:%@",            iOSManager.WX_MCHID);  
  32.     //    NSLog(@"iOSManager.WX_APP_Secret:%@",       iOSManager.WX_APP_Secret);  
  33.     //    NSLog(@"iOSManager.WX_AppKey:%@",           iOSManager.WX_AppKey);  
  34.     //    NSLog(@"iOSManager.WX_PayArticleInfo:%@",   iOSManager.WX_PayArticleInfo);  
  35.     //    NSLog(@"iOSManager.WX_PayArticleCheck:%@",  iOSManager.WX_PayArticleCheck);  
  36.       
  37. }  

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

  

[html]  view plain  copy
  1. void _WechatPay(char* gameid, char* articleid)  
  2. {  
  3.     if( [WXApi isWXAppSupportApi]  != 0)  
  4.     {  
  5.         iOSManager.WX_GameID        = [NSString stringWithUTF8String:gameid];  
  6.         iOSManager.WX_ArticledID    = [NSString stringWithUTF8String:articleid];  
  7.           
  8.         NSString *urlTag = [NSString stringWithFormat:@"%@GameID=%@&ProductID=%@", iOSManager.WX_PayArticleInfo, iOSManager.WX_GameID,iOSManager.WX_ArticledID ];  
  9.           
  10.         NSLog(@"urlTag:%@",urlTag);  
  11.           
  12.         NSURL       *url        = [NSURL URLWithString:urlTag];  
  13.         NSError     *err        = nil;  
  14.         NSString    *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error: &err];  
  15.           
  16.         NSLog(@"App服务器返回:%@",jsonString);  
  17.           
  18.         if( jsonString !=nil )  
  19.         {  
  20.               
  21.             NSDictionary *dic = [iOSManager dictionaryWithJsonString:jsonString];  
  22.               
  23.             if( dic != nil )  
  24.             {  
  25.                 iOSManager.WX_Noncestr   = dic[@"SjNumber"];  
  26.                 iOSManager.WX_OutTradNO  = dic[@"OrderID"];  
  27.                 iOSManager.WX_PrduceName = dic[@"ProductName"];  
  28.                 iOSManager.WX_Price      = dic[@"Price"];  
  29.                 //int price = [dic[@"Price"] intValue] *100;  
  30.                 //iOSManager.WX_Price      = [NSString stringWithFormat:@"%d",price];  
  31.                   
  32.                 DataMD5 *date = [[DataMD5 alloc] initWithAppid:iOSManager.WX_AppID  
  33.                                                         mch_id:iOSManager.WX_MCHID  
  34.                                                      nonce_str:iOSManager.WX_Noncestr  
  35.                                                     partner_id:iOSManager.WX_AppKey  
  36.                                                           body:@"912YULE"  
  37.                                                   out_trade_no:iOSManager.WX_OutTradNO  
  38.                                                      total_fee:iOSManager.WX_Price  
  39.                                               spbill_create_ip:[getIPhoneIP getIPAddress]  
  40.                                                     notify_url:@"www.baidu.com"  
  41.                                                     trade_type:@"APP"];  
  42.                   
  43.                 NSString* sign = [date getSignForMD5];  
  44.                   
  45.                 //设置参数并转化成xml格式  
  46.                 NSMutableDictionary *dic = [NSMutableDictionary dictionary];  
  47.                 [dic setValue:iOSManager.WX_AppID forKey:@"appid"];//公众账号ID  
  48.                 [dic setValue:iOSManager.WX_MCHID forKey:@"mch_id"];//商户号  
  49.                 [dic setValue:iOSManager.WX_Noncestr forKey:@"nonce_str"];//随机字符串  
  50.                 [dic setValue:sign forKey:@"sign"];//签名  
  51.                 [dic setValue:@"912YULE" forKey:@"body"];//商品描述  
  52.                 [dic setValue:iOSManager.WX_OutTradNO forKey:@"out_trade_no"];//订单号  
  53.                 [dic setValue:iOSManager.WX_Price forKey:@"total_fee"];//金额  
  54.                 [dic setValue:[getIPhoneIP getIPAddress] forKey:@"spbill_create_ip"];//终端IP  
  55.                 [dic setValue:@"www.baidu.com" forKey:@"notify_url"];//通知地址  
  56.                 [dic setValue:@"APP" forKey:@"trade_type"];//交易类型  
  57.                 // 转换成xml字符串  
  58.                 NSString *string = [dic XMLString];  
  59.                   
  60.                 [iOSManager getProduceArgs:string];  
  61.                   
  62.             }else  
  63.             {  
  64.                 NSLog(@"与APP服务器通讯出错");  
  65.                 [iOSManager ResoultWeChatPayFail:@"与APP服务器通讯出错!"];  
  66.             }  
  67.               
  68.               
  69.         }else  
  70.         {  
  71.             NSLog(@"与APP服务器通讯出错");  
  72.             [iOSManager ResoultWeChatPayFail:@"与APP服务器通讯出错!"];  
  73.         }  
  74.     }else  
  75.     {  
  76.         [iOSManager ResoultWeChatPayFail:@"微信不支持"];  
  77.     }  
  78. }  

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

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

[html]  view plain  copy
  1. #pragma mark   ==============获取统一订单接口==============  
  2. -(void)getProduceArgs : (NSString *) httpString  
  3. {  
  4.     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  
  5.     manager.responseSerializer = [[AFHTTPResponseSerializer alloc] init];  
  6.     [manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];  
  7.     [manager.requestSerializer setValue:@"https://api.mch.weixin.qq.com/pay/unifiedorder" forHTTPHeaderField:@"SOAPAction"];  
  8.     [manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {  
  9.         return httpString;  
  10.     }];  
  11.       
  12.     //NSLog(@"httpString =====>1:%@", httpString);  
  13.       
  14.       
  15.     [manager POST:WXUNIFIEDORDERURL parameters:httpString progress:^(NSProgress * _Nonnull uploadProgress) {  
  16.     } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject)  
  17.      {  
  18.          NSString *responseString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding] ;  
  19.            
  20.          NSLog(@"responseString is %@",responseString);  
  21.          NSDictionary *dic = [NSDictionary dictionaryWithXMLString:responseString];  
  22.          //判断返回的许可  
  23.          if ([[dic objectForKey:@"result_code"] isEqualToString:@"SUCCESS"] &&[[dic objectForKey:@"return_code"] isEqualToString:@"SUCCESS"] ) {  
  24.              //发起微信支付,设置参数  
  25.              NSLog(@"发起微信支付,设置参数");  
  26.                
  27.                
  28.              PayReq *request     = [[PayReq alloc] init];  
  29.              request.openID      = [dic objectForKey:@"appid"];  
  30.              request.partnerId   = [dic objectForKey:@"mch_id"];  
  31.              request.prepayId    = [dic objectForKey:@"prepay_id"];  
  32.              request.package     = @"Sign=WXPay";  
  33.              request.nonceStr    = [dic objectForKey:@"nonce_str"];  
  34.                
  35.              iOSManager.WX_Prepay_id = request.prepayId;  
  36.                
  37.                
  38.              //将当前事件转化成时间戳  
  39.              NSDate *datenow     = [NSDate date];  
  40.              NSString *timeSp    = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]];  
  41.              UInt32 timeStamp    = [timeSp intValue];  
  42.              request.timeStamp   = timeStamp;  
  43.              // 签名加密  
  44.                
  45.              DataMD5 *md5 = [[DataMD5 alloc] initWithAppid:iOSManager.WX_AppID  
  46.                                                     mch_id:iOSManager.WX_MCHID  
  47.                                                  nonce_str:iOSManager.WX_Noncestr  
  48.                                                 partner_id:iOSManager.WX_AppKey  
  49.                                                       body:@"912YULE"  
  50.                                               out_trade_no:iOSManager.WX_OutTradNO  
  51.                                                  total_fee:iOSManager.WX_Price  
  52.                                           spbill_create_ip:[getIPhoneIP getIPAddress]  
  53.                                                 notify_url:@"www.baidu.com"  
  54.                                                 trade_type:@"APP"];  
  55.                
  56.              request.sign    = [md5 createMD5SingForPay:request.openID  
  57.                                               partnerid:request.partnerId  
  58.                                                prepayid:request.prepayId  
  59.                                                 package:request.package  
  60.                                                noncestr:request.nonceStr  
  61.                                               timestamp:request.timeStamp];  
  62.              //             // 调用微信  
  63.              //             NSLog(@"request.openID:%@",     request.openID);  
  64.              //             NSLog(@"request.partnerId:%@",  request.partnerId);  
  65.              //             NSLog(@"request.prepayId:%@",   request.prepayId);  
  66.              //             NSLog(@"request.package:%@",    request.package);  
  67.              //             NSLog(@"request.nonceStr:%@",   request.nonceStr);  
  68.              //             NSLog(@"request.timeStamp:%u",  (unsigned int)request.timeStamp);  
  69.              //             NSLog(@"request.sign:%@",       request.sign);  
  70.                
  71.                
  72.              [WXApi sendReq:request];  
  73.              //[WXApi on]  
  74.                
  75.              //[MBProgressHUD hideHUD];  
  76.          }else{  
  77.              //LXLog(@"参数不正确,请检查参数");  
  78.              //[MBProgressHUD hideHUD];  
  79.              //[MBProgressHUD showError:@"支付错误!"];  
  80.              [iOSManager ResoultWeChatPayFail:@"与服务器通讯出错!"];  
  81.          }  
  82.            
  83.            
  84.      } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)  
  85.      {  
  86.          NSLog(@"error is %@",error);  
  87.            
  88.          [iOSManager ResoultWeChatPayFail:@"与服务器通讯出错!"];  
  89.      }];  
  90.       
  91. }  

然后 unity3D 端 






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

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

头文件




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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值