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.后来发现 调起支付 并且完成以后, 微信支付回调
头文件
估计不太详细 核心源码:http://download.csdn.net/detail/nicepainkiller/9862138
本人 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
相关文章推荐
- Unity3D Optimizing Graphics Performance for iOS
- Unity3D For iPhone游戏引擎之构建游戏框架与导出IOS项目(一)
- Unity3D for iOS初级教程:Part 1/3(下)
- Unity3D for iOS初级教程:Part 2/3
- unity3d for iOS Objective-C与JavaScript的交互
- Unity3D Optimizing Graphics Performance for iOS
- Unity3D for iOS初级教程:Part 3/3(下)
- unity3d Optimising with Unity for iOS
- Unity3D for iOS初级教程:Part 2/3
- IOS开发之NSDictionary里setValue:forKey与setObject:forKey、objectForKey与valueForKey的差异
- ArcGIS(version 100) for iOS 搜索
- (转载)XML Tutorial for iOS: How To Choose The Best XML Parser for Your iPhone Project
- How to Configure iOS for iPhone and iPad to Use So
- iOS开发——heightForHeaderInSection设置高度无效
- ArcGIS for IOS 10.2.5坐标系转换
- Appium problems for IOS real devices
- iOS –app微信支付
- iOS 8.0 bluetooth peripheral manager giving no callback for addService
- Xcode 9 compiling IB documents for earlier than ios 7 is no longer supported
- CodeSign error: code signing is required for product type 'Application' in SDK 'iOS 5.0'