unity3d 接入微信支付 for IOS
本人 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 端
4.后来发现 调起支付 并且完成以后, 微信支付回调
-(void)onResp:(BaseResp *)resp {并没有执行 。 然后 把回调写在了 导出的 xcode 工程的 UnityAppController.mm 中就能回调了
头文件