您的位置:首页 > 移动开发 > Unity3D

unity3d 微信支付 for IOS

2018-01-30 22:21 225 查看
http://blog.csdn.net/nicepainkiller/article/details/72876754

本人 unity3D 开发 因项目 需要 接入 微信 支付, 步步填坑。和大家风险下 坑经验!
因为这边服务器暂时没有到位。 所以 一切处理 都是在客户端完成!

首先感谢这个这位博主:http://www.jianshu.com/p/94dcc220b2aa
主要的几个文件 给大家分享下!

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

[html] view
plain copy

// 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. 这一步是构造 统一下单的 数据   其中的参数 我有项目的参数 大家不用删掉就好

  

[html] view
plain copy

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 文件,以及添加依赖库 参考    参考

[html] view
plain copy

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: