unity3d 接入支付 for IOS,unity3dios
本人 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 中就能回調了
標頭檔