前提是已經(jīng)創(chuàng)建完應(yīng)用了在微信的官網(wǎng)上。根據(jù)上一篇的微信獲得支付能力的步驟妹田,這一篇主要制作微信支付的demo芯勘。回顧上一篇內(nèi)容請(qǐng)看iOS微信支付步驟以及出現(xiàn)的問(wèn)題總結(jié)(一)
查看下一篇iOS微信支付步驟以及出現(xiàn)的問(wèn)題總結(jié)(三)?淳地。
往往回憶就是痛苦的因?yàn)橛洸蛔≡?jīng)的經(jīng)歷,還是喜歡簡(jiǎn)單粗暴帅容。
1.微信支付的demo與SDK颇象。網(wǎng)址
2.下載完之后,里面有好多的沒(méi)用的文件丰嘉,包括登錄夯到,分享嚷缭,等等饮亏。(看到這里好惡心,為啥不單獨(dú)做一個(gè)demo呢阅爽,哎,還能不能愉快的玩耍了)。
如下 的文件夾目錄的內(nèi)容:
3.創(chuàng)建一個(gè)wxDemo工程厌小。
4.查看微信的官方文檔贮缅。iOS微信支付文檔
5.因?yàn)楝F(xiàn)在 的工程是iOS9 ,所以需要配置網(wǎng)址與白名單百侧。
6.改變bitcode設(shè)置為NO砰识。
7.添加URL Types,如下佣渴。
8.添加微信SDK到wxDemo里面辫狼。
9.添加框架,用來(lái)安裝應(yīng)用辛润。iOS文檔鏈接 膨处。需要添加以下庫(kù):
SystemConfiguration.framework,
libz.dylib,
libsqlite3.0.dylib,
libc++.dylib
如下圖:
10.在Appdelegate.m里面添加如下代碼:
//注冊(cè)微信支付
[WXApi ? ? ? registerApp:@"wxXXXXXXXXXX"]; 此時(shí)運(yùn)行編譯,快捷鍵commd+b 運(yùn)行程序會(huì)出現(xiàn)以下錯(cuò)誤,以下是錯(cuò)誤的信息:
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_CTTelephonyNetworkInfo", referenced from:
objc-class-ref in libWeChatSDK.a(MTAHelper.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
錯(cuò)誤的圖片:
11.修改錯(cuò)誤操作真椿,由于缺少一個(gè)依賴庫(kù):添加一個(gè)CoreTelephony.frame 依賴庫(kù)鹃答,就可以解決了。
12.根據(jù)微信里面的demo突硝,添加需要的代碼测摔。以下是文件目錄的一些解釋:里面主要的方法就是支付的網(wǎng)絡(luò)請(qǐng)求以及調(diào)用微信客戶端的代碼。
13.添加一個(gè)按鈕的方法解恰,實(shí)現(xiàn)支付避咆。
說(shuō)明:支付目前來(lái)說(shuō)有兩種實(shí)現(xiàn)方式,一種是本地的app直接實(shí)現(xiàn)跳轉(zhuǎn)進(jìn)行支付修噪;另一種方式是通過(guò)后臺(tái)服務(wù)器進(jìn)行網(wǎng)絡(luò)請(qǐng)求查库。下面的這一種是通過(guò)服務(wù)器進(jìn)行支付的跳轉(zhuǎn)。
- (void)WXPay {
NSString*urlString=@"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios";
//解析服務(wù)端返回json數(shù)據(jù)
NSError*error;
//加載一個(gè)NSURL對(duì)象
NSURLRequest*request = [NSURLRequestrequestWithURL:[NSURLURLWithString:urlString]];
//將請(qǐng)求的url數(shù)據(jù)放到NSData對(duì)象中
NSData*response = [NSURLConnectionsendSynchronousRequest:requestreturningResponse:nilerror:nil];
if(response !=nil) {
NSMutableDictionary*dict =NULL;
//IOS5自帶解析類NSJSONSerialization從response中解析出數(shù)據(jù)放到字典中
dict = [NSJSONSerializationJSONObjectWithData:responseoptions:NSJSONReadingMutableLeaveserror:&error];
NSLog(@"********url:%@",urlString);
if(dict !=nil){
NSMutableString*retcode = [dictobjectForKey:@"retcode"];
if(retcode.intValue==0){
NSMutableString*stamp= [dictobjectForKey:@"timestamp"];
//調(diào)起微信支付 ?
//注意:此處的key一定要與demo中的key的字符一致黄琼,一個(gè)也不能少樊销,一個(gè)也不能錯(cuò)。
PayReq* req= [[PayReqalloc]init];
req.partnerId= [dictobjectForKey:@"partnerid"];
req.prepayId= [dictobjectForKey:@"prepayid"];
req.nonceStr= [dictobjectForKey:@"noncestr"];
req.timeStamp= stamp.intValue;
req.package= [dictobjectForKey:@"package"];
req.sign= [dictobjectForKey:@"sign"];
[WXApisendReq:req];
//日志輸出
NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",[dictobjectForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign);
}else{
NSLog(@"%@",[dictobjectForKey:@"retmsg"]);
}
}else{
NSLog(@"服務(wù)器返回錯(cuò)誤脏款,未獲取json對(duì)象");
}
}else{
NSLog(@"服務(wù)器返回錯(cuò)誤");
}
}
14.在完成此處之后围苫,點(diǎn)擊支付按鈕會(huì)出現(xiàn)下面的問(wèn)題:
在跳轉(zhuǎn)到支付界面之后,僅僅會(huì)出現(xiàn)一個(gè)“確定”的白色按鈕撤师。如下圖:
通過(guò)查找信息剂府,是由于配置的參數(shù)問(wèn)題。因此我們不用服務(wù)器端進(jìn)行網(wǎng)絡(luò)請(qǐng)求直接用自己生成這些參數(shù)剃盾,然后就可以實(shí)現(xiàn)支付功能了腺占。
15.下面是獲取參數(shù)的解釋。
參數(shù)解釋:
partnerId:?商家向財(cái)付通申請(qǐng)的商家id(就是自己的id痒谴,也就是在你申請(qǐng)開發(fā)者資質(zhì)認(rèn)證之后衰伯,有一個(gè)商戶平臺(tái),這個(gè)平臺(tái)對(duì)應(yīng)的id积蔚,就是你自己的id意鲸。好像還沒(méi)有說(shuō)明白。)
獲取方式:
打開鏈接尽爆,直接將微信發(fā)送給你的郵件里面的內(nèi)容登陸商戶平臺(tái)怎顾,就找到了partnerid了。微信商戶平臺(tái)
prepayId:?預(yù)支付訂單(需要向微信服務(wù)器提交申請(qǐng)后返回的一個(gè)支付交易ID)
獲取方式:
這個(gè)一般情況下是服務(wù)器端已經(jīng)申請(qǐng)好的漱贱,客戶端直接調(diào)用槐雾。
a、微信的服務(wù)端返回的參數(shù)的說(shuō)明:參數(shù)說(shuō)明饱亿。(看著很亂蚜退,可是呢闰靴,還是太亂)
b、還要生成一個(gè)簽名钻注,這個(gè)官方文檔也是寫了蚂且。簽名(雖然看著很簡(jiǎn)單,但是還是搞不定幅恋,坑太多杏死,哎,沒(méi)辦法就是這么坑捆交,多看幾遍就好了)
根據(jù)微信的接口淑翼,返回的xml的數(shù)據(jù)參數(shù)。將數(shù)據(jù)解析之后品追,就能獲得prepayid玄括。
nonceStr: 隨機(jī)串,防重發(fā)(隨機(jī)字符串肉瓦,不長(zhǎng)于32位)
獲取方式:
注意:#pragma mark-? 需要引入依賴庫(kù)libcommonCrypto.tbd并且引入頭文件#import <CommonCrypto/CommonGigest.h>
const ?char*str = [input ? UTF8String];
unsigned ? char ? result[CC_MD5_DIGEST_LENGTH];
CC_MD5(str,strlen(str),result);
NSMutableString* ?ret = [NSMutableString ?stringWithCapacity:CC_MD5_DIGEST_LENGTH*2];
for(int i = 0 ;i <CC_MD5_DIGEST_LENGTH;i++) {
?[ret appendFormat:@"%02X",result[i]];
}
NSLog(@"%@",[ret? uppercaseString]);
注意:就是一個(gè)隨機(jī)數(shù)遭京。noncestr就是在第一次生成簽名的時(shí)候的那個(gè)隨機(jī)數(shù),不要再次生成泞莉。
timeStamp:時(shí)間戳哪雕,防重發(fā)(標(biāo)準(zhǔn)北京時(shí)間,時(shí)區(qū)為東八區(qū)鲫趁,自1970年1月1日 0點(diǎn)0分0秒以來(lái)的秒數(shù))
獲取方式:
NSString* timeString = [NSString ? ? ?stringWithFormat:@"%.0f"[[NSDate date]timeIntervalSince1970]];
由于:
@property(nonatomic,assign)UInt32 ?timeStamp;
所以在提交的時(shí)候需要轉(zhuǎn)換成對(duì)應(yīng)的格式斯嚎,UInt32 格式。
sign:商家根據(jù)微信開放平臺(tái)文檔對(duì)數(shù)據(jù)做的簽名挨厚,鏈接
這里的簽名不同于你第一次申請(qǐng)的prepayid的簽名堡僻,這里的簽名的參數(shù)是appid,prepayid,partnerid,timestamp,noncestr,package ? 這幾個(gè)排序后再拼接的key最后生成一個(gè)sign。
上面這些只是介紹了這些參數(shù)如何獲取幽崩,在下面一篇文章中苦始,開始仔細(xì)介紹寞钥,最后一步的支付流程慌申,也就是配置參數(shù)、服務(wù)器相關(guān)的一些配置理郑。
參考資源:
2.iOS微信支付