2017-06-06 12:42:34 nicepainkiller 阅读数 3377

本人 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

2020-01-03 19:24:03 zxc8890304 阅读数 30

循环引用的本质是什么?

多个对象相互都是强引用,不能释放让系统回收,对象A强引用对象B,对象B强引用对象C,对象C强引用对象A

iOS内存中的分区为:栈.堆,静态区! 栈区和静态区是操作系统自己管理回收的,不会造成循环阴影.堆区是由程序员来控制的,在堆区中的相互引用无法回收的话就会造成循环引用

解决循环引用的方式一般是将strong改为weak引用

weak:weak表示指向但是不拥有对象,引用计数器也不会增加,不需要手动销毁,内存会自动销毁

Strong:strong表示指向并且拥有对象,引用计数器增加1,引用计数器不为0时不会销毁,可强行将其修改为nil进行销毁

常见的场景就是闭包,UITabeview,Delegate,NSTimer

闭包

在copy的时候都会对block内部用到强引用的,对象A强引用对象B,对象B强引用对象C,对象C强引用对象A

在self将block作为自己的属性变量的时候,而在block的方法体里面也引用了self的本身,这就很产生了一个循环已用

处理方式为将这个self改为弱引用

在内部调用了延时函数还使用弱指针的话会取不到该指针,因为已经被销毁了,需要block内部将弱指针再强引用一下

来来来,最优质的的宏定义,OMG,用它!!!

    // weak obj
    /#define WEAK_OBJ(type)  __weak typeof(type) weak##type = type;

    // strong obj
    /#define STRONG_OBJ(type)  __strong typeof(type) str##type = weak##type;

Delegate 

在协议的代理对象都是weak来修饰的,用strong来修饰会造成循环引用

其实在开发过程中用strong(retain)并不会发现不妥,因为功能实现就好了

在delegate属性声明的时候用strong

self ->aVC

BViewController *bVC = [[BViewController alloc] init];

bVC = self;

bVC.delegate引用计数器+1

aVC本身引用的BViewControllerDelagate,计数器+1

所以AViewControllerDelagate==Deleagate

该对象强行引用了,外部无法正常对其进行释放,所以造成了循环引用

改用weak指向该对象不被强行引用,外部可以对其进行释放

2017-01-05 22:16:27 geanwen 阅读数 831

做项目的时候肯定会遇到圆形图片的展示。

使用UIButton来展示圆形图片,方便以后加点击事件,并且通过圆角的设置来达到圆形图片的目的。

很简单,直接看代码吧:

//头像
		private UIButton _headerImg = null;
		public UIButton HeaderImg
		{
			get
			{
				if (_headerImg == null)
				{
					_headerImg = new UIButton();
					_headerImg.SetImage(HeadUIImage, UIControlState.Normal);

					// 点击事件
					_headerImg.TouchUpInside += (sender, e) => { 
						
					};

					_headerImg.Layer.MasksToBounds = true;

					// 这里需要注意:需要把圆角大小设置为你button的高度的一半。
					_headerImg.Layer.CornerRadius = 33f;
				}
				return _headerImg;
			}
		}


完!


2016-03-25 20:30:41 lgx_admin 阅读数 2425

for循环创建button

for (int i = 0; i < 9; i++)
    {
        int a = i/4;   //取余
        int b = i%4;   //取整
        UIButton *tagButton = [[UIButton alloc] initWithFrame:CGRectMake(20+(10+(kScreenWidth-6)/5)*b, 90+(20+10)*a, (kScreenWidth-6)/5, 20)];
        tagButton.layer.borderColor = MyHexColor(@"ee2266").CGColor;
        tagButton.layer.borderWidth = 1;
        tagButton.layer.cornerRadius = 5;
        tagButton.tag = i;
        tagButton.titleLabel.font = [UIFont systemFontOfSize:12];
        [tagButton setTitle:_buttonArray[i] forState:UIControlStateNormal];
        [tagButton setTitleColor:MyHexColor(@"ee2266") forState:UIControlStateNormal];
        [tagButton addTarget:self action:@selector(tagButtonAction:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:tagButton];
    }



2016-03-08 15:33:23 RunCsdn 阅读数 278

前言

本篇文章精讲iOS开发中使用Block时一定要注意内存管理问题,很容易造成循环引用。本篇文章的目标是帮助大家快速掌握使用block的技巧。

我相信大家都觉得使用block给开发带来了多大的便利,但是有很多开发者对block内存管理掌握得不够好,导致经常出现循环引用的问题。对于新手来说,出现循环引用时,是很难去查找的,因此通过Leaks不一定能检测出来,更重要的还是要靠自己的分析来推断出来。

声景一:Controller之间block传值

现在,我们声明两个控制器类,一个叫ViewController,另一个叫HYBAController。其中,ViewController有一个按钮,点击时会push到HYBAController下。

先看HYBAController:

下面分几种小场景来看看循环引用问题:


windows下unity3d工程导出iOS项目

博文 来自: skylin19840101

Unity3D整合到iOS工程

阅读数 4079

IOS 几个常用的循环

阅读数 13826

ios中的循环引用

阅读数 247

没有更多推荐了,返回首页