欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

unity3d 接入微信支付 for IOS

程序员文章站 2022-03-23 09:37:29
本人 unity3D 开发 因项目 需要 接入 微信 支付, 步步填坑。和大家风险下 坑经验! 因为这边服务器暂时没有到位。 所以 一切处理 都是在客户端完成! 主要的几个...

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

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

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

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

[html]view plaincopy

//C函数UNity3d调用具体实现

//**********************************

void_startUp(char*info)

{

[NativeIOSManagerinstance];

//NSLog(@"传来的参数:>>%s",info);

NSString*initInfo=[NSStringstringWithUTF8String:info];

NSDictionary*dic=[iOSManagerdictionaryWithJsonString: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"];

[WXApiregisterApp:iOSManager.WX_AppID];

NSLog(@"注册微信......");

}else

{

NSLog(@"参数赋值失败");

[iOSManagerResoultWeChatPayFail:@"初始化失败"];

}

//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 plaincopy

void_WechatPay(char*gameid,char*articleid)

{

if([WXApiisWXAppSupportApi]!=0)

{

iOSManager.WX_GameID=[NSStringstringWithUTF8String:gameid];

iOSManager.WX_ArticledID=[NSStringstringWithUTF8String:articleid];

NSString*urlTag=[NSStringstringWithFormat:@"%@GameID=%@&ProductID=%@",iOSManager.WX_PayArticleInfo,iOSManager.WX_GameID,iOSManager.WX_ArticledID];

NSLog(@"urlTag:%@",urlTag);

NSURL*url=[NSURLURLWithString:urlTag];

NSError*err=nil;

NSString*jsonString=[NSStringstringWithContentsOfURL:urlencoding:NSUTF8StringEncodingerror:&err];

NSLog(@"App服务器返回:%@",jsonString);

if(jsonString!=nil)

{

NSDictionary*dic=[iOSManagerdictionaryWithJsonString:jsonString];

if(dic!=nil)

{

iOSManager.WX_Noncestr=dic[@"SjNumber"];

iOSManager.WX_OutTradNO=dic[@"OrderID"];

iOSManager.WX_PrduceName=dic[@"ProductName"];

iOSManager.WX_Price=dic[@"Price"];

//intprice=[dic[@"Price"]intValue]*100;

//iOSManager.WX_Price=[NSStringstringWithFormat:@"%d",price];

DataMD5*date=[[DataMD5alloc]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:[getIPhoneIPgetIPAddress]

notify_url:@"www.baidu.com"

trade_type:@"APP"];

NSString*sign=[dategetSignForMD5];

//设置参数并转化成xml格式

NSMutableDictionary*dic=[NSMutableDictionarydictionary];

[dicsetValue:iOSManager.WX_AppIDforKey:@"appid"];//公众账号ID

[dicsetValue:iOSManager.WX_MCHIDforKey:@"mch_id"];//商户号

[dicsetValue:iOSManager.WX_NoncestrforKey:@"nonce_str"];//随机字符串

[dicsetValue:signforKey:@"sign"];//签名

[dicsetValue:@"912YULE"forKey:@"body"];//商品描述

[dicsetValue:iOSManager.WX_OutTradNOforKey:@"out_trade_no"];//订单号

[dicsetValue:iOSManager.WX_PriceforKey:@"total_fee"];//金额

[dicsetValue:[getIPhoneIPgetIPAddress]forKey:@"spbill_create_ip"];//终端IP

[dicsetValue:@"www.baidu.com"forKey:@"notify_url"];//通知地址

[dicsetValue:@"APP"forKey:@"trade_type"];//交易类型

//转换成xml字符串

NSString*string=[dicXMLString];

[iOSManagergetProduceArgs:string];

}else

{

NSLog(@"与APP服务器通讯出错");

[iOSManagerResoultWeChatPayFail:@"与APP服务器通讯出错!"];

}

}else

{

NSLog(@"与APP服务器通讯出错");

[iOSManagerResoultWeChatPayFail:@"与APP服务器通讯出错!"];

}

}else

{

[iOSManagerResoultWeChatPayFail:@"微信不支持"];

}

}

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

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

[html]view plaincopy

#pragmamark==============获取统一订单接口==============

-(void)getProduceArgs:(NSString*)httpString

{

AFHTTPSessionManager*manager=[AFHTTPSessionManagermanager];

manager.responseSerializer=[[AFHTTPResponseSerializeralloc]init];

[manager.requestSerializersetValue:@"text/xml;charset=utf-8"forHTTPHeaderField:@"Content-Type"];

[manager.requestSerializersetValue:@"https://api.mch.weixin.qq.com/pay/unifiedorder"forHTTPHeaderField:@"SOAPAction"];

[manager.requestSerializersetQueryStringSerializationWithBlock:^NSString*(NSURLRequest*request,NSDictionary*parameters,NSError*__autoreleasing*error){

returnhttpString;

}];

//NSLog(@"httpString=====>1:%@",httpString);

[managerPOST:WXUNIFIEDORDERURLparameters:httpStringprogress:^(NSProgress*_NonnulluploadProgress){

}success:^(NSURLSessionDataTask*_Nonnulltask,id_NullableresponseObject)

{

NSString*responseString=[[NSStringalloc]initWithData:responseObjectencoding:NSUTF8StringEncoding];

NSLog(@"responseStringis%@",responseString);

NSDictionary*dic=[NSDictionarydictionaryWithXMLString:responseString];

//判断返回的许可

if([[dicobjectForKey:@"result_code"]isEqualToString:@"SUCCESS"]&&[[dicobjectForKey:@"return_code"]isEqualToString:@"SUCCESS"]){

//发起微信支付,设置参数

NSLog(@"发起微信支付,设置参数");

PayReq*request=[[PayReqalloc]init];

request.openID=[dicobjectForKey:@"appid"];

request.partnerId=[dicobjectForKey:@"mch_id"];

request.prepayId=[dicobjectForKey:@"prepay_id"];

request.package=@"Sign=WXPay";

request.nonceStr=[dicobjectForKey:@"nonce_str"];

iOSManager.WX_Prepay_id=request.prepayId;

//将当前事件转化成时间戳

NSDate*datenow=[NSDatedate];

NSString*timeSp=[NSStringstringWithFormat:@"%ld",(long)[datenowtimeIntervalSince1970]];

UInt32timeStamp=[timeSpintValue];

request.timeStamp=timeStamp;

//签名加密

DataMD5*md5=[[DataMD5alloc]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:[getIPhoneIPgetIPAddress]

notify_url:@"www.baidu.com"

trade_type:@"APP"];

request.sign=[md5createMD5SingForPay: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",(unsignedint)request.timeStamp);

//NSLog(@"request.sign:%@",request.sign);

[WXApisendReq:request];

//[WXApion]

//[MBProgressHUDhideHUD];

}else{

//LXLog(@"参数不正确,请检查参数");

//[MBProgressHUDhideHUD];

//[MBProgressHUDshowError:@"支付错误!"];

[iOSManagerResoultWeChatPayFail:@"与服务器通讯出错!"];

}

}failure:^(NSURLSessionDataTask*_Nullabletask,NSError*_Nonnullerror)

{

NSLog(@"erroris%@",error);

[iOSManagerResoultWeChatPayFail:@"与服务器通讯出错!"];

}];

}

然后 unity3D 端

unity3d 接入微信支付 for IOS

unity3d 接入微信支付 for IOS

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

-(void)onResp:(BaseResp *)resp {
并没有执行 。 然后 把回调写在了 导出的 xcode 工程的 UnityAppController.mm 中就能回调了

头文件unity3d 接入微信支付 for IOS

unity3d 接入微信支付 for IOS