前言:本篇文章目的在于梳理知識篡殷,鞏固思想变勇,學(xué)習(xí)總結(jié)。有什么好的建議贴唇,都可以留言》纱互相促進(jìn)戳气!
總觀,微信支付巧鸭,也沒心思瓶您,好好看文檔。文檔微微有些亂纲仍。感覺呀袱,微信demo,內(nèi)部功能都集成到一塊了郑叠,不好查找夜赵。終于,在各種坑下乡革,仔細(xì)看了一遍文檔寇僧,默默的弄完了。
會(huì)用到的網(wǎng)址如下:
微信開放平臺(tái)
微信商戶平臺(tái)
iOS微信支付在線文檔
SDK集成文檔大體方向:
1.注冊微信開放平臺(tái),創(chuàng)建應(yīng)用獲取appid,APPSecret,申請支付功能,申請成功之后會(huì)返回一些參數(shù).
2.下載微信支付SDK.
3.客戶端請求訂單,后臺(tái)與微信后臺(tái)交互,返回給客戶端支付參數(shù).
4.調(diào)用微信客戶端,由微信客戶端和微信服務(wù)器打交道.
5.客戶端和服務(wù)器都會(huì)收到支付結(jié)果.
1.準(zhǔn)備工作
(我們公司的微信支付申請是公司申請完之后沸版,創(chuàng)建完應(yīng)用后給我的,但是還要清楚一下大概流程)
a.注冊開發(fā)者賬號
進(jìn)入微信開放平臺(tái)嘁傀,注冊開發(fā)者賬號(必須申請)。申請開發(fā)者資質(zhì)認(rèn)證视粮,300元一年细办。除了能使用微信開放平臺(tái)的一些高級功能外,可以不用認(rèn)證蕾殴。
b.注冊應(yīng)用
拿到微信開發(fā)者賬號后笑撞,登錄微信開放平臺(tái),進(jìn)入管理中心区宇,創(chuàng)建新的移動(dòng)應(yīng)用娃殖。
創(chuàng)建應(yīng)用我向大家都會(huì),具體細(xì)節(jié)就不截圖了议谷。
c. 獲取app ID和appSecret
創(chuàng)建成功炉爆,獲得appid和appSecret。點(diǎn)擊查看,如下圖芬首。
驗(yàn)證之后赴捞,會(huì)返回我們要獲得的app ID和appSecret如下圖,保留好郁稍。
d. 申請開通支付權(quán)限
登錄微信開放平臺(tái)——管理中心——?jiǎng)?chuàng)建移動(dòng)應(yīng)用赦政,找到注冊的相應(yīng)的應(yīng)用,接口名稱——微信支付——申請開通支付去權(quán)限耀怜。資料填寫完畢恢着,等待審核。
成功后财破,則收到一封郵件掰派,獲得商戶號,商戶登錄賬號以及登錄密碼左痢。
e. 賬戶驗(yàn)證
登錄微信開放平臺(tái)——管理中心靡羡,找到相對應(yīng)的應(yīng)用,查看——微信支付(接口狀態(tài)—已獲得)——查看詳情俊性,按照它的提示步驟操作略步。
獲知收到的確認(rèn)金,進(jìn)行驗(yàn)證定页。驗(yàn)證通過趟薄,準(zhǔn)備工作完畢。
開通微信支付典徊,有的不一定竟趾,有的一個(gè)星期,有的很長宫峦。我也不知道大概時(shí)間岔帽,我們這個(gè)申請好長時(shí)間了。
點(diǎn)擊-->查看詳情(了解一下支付的詳情)
f.獲得API密鑰
f.1用獲得的商戶登錄賬號和密碼
f.2登錄微信商戶平臺(tái)——賬戶中心——賬戶設(shè)置——API安全——API密鑰
f.3安裝操作證書导绷,再設(shè)置密鑰犀勒。
(這步千萬別忘了,其實(shí)按照郵件上的說明走就OK了妥曲。微信流程一步錯(cuò)了贾费,就容易出問題,謹(jǐn)記按部就班走檐盟,不要浪費(fèi)沒有必要的時(shí)間褂萧,微信支付申請,基本工作準(zhǔn)備就完畢了葵萎。)小結(jié):
1.創(chuàng)建應(yīng)用獲取app ID和appSecre
2.開通支付功能
3.獲取郵件里商戶號和賬號密碼
4.商戶平臺(tái)导犹,下載證書唱凯,獲得api秘鑰補(bǔ)充:創(chuàng)建移動(dòng)應(yīng)用并成功之后會(huì)受到騰訊發(fā)來的郵件如下
注意:
通過郵件我們能獲得重要的參數(shù):
(1):AppID
(2):微信支付商戶號
(3):前往商戶平臺(tái)完成入駐
(4):API秘鑰(自己設(shè)置即可,注意一定要32位字母加數(shù)字的組合)記得保存好秘鑰谎痢,以后要使用磕昼。$_$; 有了這些參數(shù)后,我們就可以開發(fā)自己的項(xiàng)目了。
2. SDK集成及環(huán)境配置
下面讓我們一起創(chuàng)建工程节猿,一起去集成微信支付的SDK吧票从。下載地址如下:
官方SDK及Demo下載地址
如上圖,SDK版本1.7.9滨嘱,ios9_v3_pay
1.將我們下載的SDK導(dǎo)入我們的工程峰鄙。
2.在Target —> General —> Link Binary With Libraries— 點(diǎn)擊+號 -> 搜索你需要的系統(tǒng)庫,如下:
SystemConfiguration.framework libz.tbd libsqlite3.0.tbd CoreTelephony.framework QuartzCore.framework
- 3 設(shè)置URL Scheme:為了app之間的跳轉(zhuǎn)
在注冊微信平臺(tái)APP的時(shí)候太雨,會(huì)給一個(gè)唯一識別標(biāo)識符(APPID)先馆。
這里的url schemes就填在微信開發(fā)平臺(tái)申請的appID
打開工程->info->URL types
- 4.配置白名單(貌似不配置白名單也能跳轉(zhuǎn),但還是寫全了為妙)躺彬。
或者info.plist右鍵->source code打開添加下面這段代碼<key>LSApplicationQueriesSchemes</key>
<array><string>wechat</string>
<string>weixin </string>
</array>
4.有的時(shí)候會(huì)出現(xiàn)莫名奇妙的問題例如下面:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM enqueue:]: unrecognized selector sent to instance 0x60000024ef40'在buddle Seeting 里面的Other Linker Flags 中添加-ObjC就可以了。
Com + R,如果不出什么問題梅惯,基本上就集成完畢了宪拥,環(huán)境也配置好呢。
3.代碼布局吊起微信支付
在吊起微信之前铣减,必須要知道微信支付是一個(gè)怎么樣的過程她君。
【了解一下-官方流程】
商戶系統(tǒng)和微信支付系統(tǒng)主要交互說明:
步驟1:用戶在商戶APP中選擇商品,提交訂單葫哗,選擇微信支付缔刹。
步驟2:商戶后臺(tái)收到用戶支付單,調(diào)用微信支付統(tǒng)一下單接口劣针。參見【統(tǒng)一下單API】校镐。
步驟3:統(tǒng)一下單接口返回正常的prepay_id,再按簽名規(guī)范重新生成簽名后捺典,將數(shù)據(jù)傳輸給APP鸟廓。參與簽名的字段名為appid,partnerid襟己,prepayid引谜,noncestr,timestamp擎浴,package员咽。注意:package的值格式為Sign=WXPay
步驟4:商戶APP調(diào)起微信支付。api參見本章節(jié)【app端開發(fā)步驟說明】
步驟5:商戶后臺(tái)接收支付通知贮预。api參見【支付結(jié)果通知API】
步驟6:商戶后臺(tái)查詢支付結(jié)果贝室。契讲,api參見【查詢訂單API】【網(wǎng)上好的流程分享】
1、用戶使用APP客戶端档玻,選擇商品下單怀泊。
2、商戶客戶端(就是你做的APP)將用戶的商品數(shù)據(jù)傳給商戶服務(wù)器误趴,請求生成支付訂單霹琼。
3、商戶后臺(tái)調(diào)用統(tǒng)一下單API向微信的服務(wù)器發(fā)送請求凉当,微信服務(wù)器生成預(yù)付單枣申,并生成一個(gè)prepay_id返回給商戶后臺(tái)。
4看杭、商戶后臺(tái)將這個(gè)prepay_id返回給商戶客戶端忠藤。
5、用戶點(diǎn)擊確認(rèn)支付楼雹,這時(shí)候商戶客戶端調(diào)用SDK打開微信客戶端模孩,進(jìn)行微信支付。
6贮缅、微信客戶端向微信服務(wù)器發(fā)起支付請求并返回支付結(jié)果(他們之間交互用的就是prepay_id這個(gè)參數(shù)榨咐,微信的服務(wù)器要驗(yàn)證微信客戶端傳過去的參數(shù)是否跟第三步中生成的那個(gè)id一致)。
7谴供、用戶輸入支付密碼后块茁,微信客戶端提交支付授權(quán),跟微信服務(wù)器交互桂肌,完成支付数焊。
8、微信服務(wù)器給微信客戶端發(fā)送支付結(jié)果提示崎场,并異步給商戶服務(wù)器發(fā)送支付結(jié)果通知佩耳。
9、商戶客戶端通過支付結(jié)果回調(diào)接口查詢支付結(jié)果谭跨,并向后臺(tái)檢查支付結(jié)果是否正確蚕愤,后臺(tái)返回支付結(jié)果。
10饺蚊、商戶客戶端顯示支付結(jié)果萍诱,完成訂單,發(fā)貨污呼。
客戶端主要工作
1.調(diào)起微信客戶端發(fā)起支付 2.顯示支付結(jié)果
吊起準(zhǔn)備
調(diào)用微信支付前裕坊,需要下單、簽名等操作燕酷,以便獲取微信支付所必要的參數(shù)籍凝。為了提高安全性周瞎,下單、簽名操作一般是在后臺(tái)完成饵蒂。
需要的參數(shù)包括:appid声诸、partid(商戶號)、prepayid(預(yù)支付訂單ID)退盯、noncestr(參與簽名的隨機(jī)字符串)彼乌、timestamp(參與簽名的時(shí)間戳)、sign(簽名字符串)這六個(gè)渊迁。
[代碼示例①:]
如果所有信息的生成都在前端完成慰照,包括對訂單進(jìn)行sign簽名以及MD5簽名加密(此方法相對來說有些復(fù)雜,沒有官方給的方法簡單)您可以看參考文章iOS應(yīng)用之微信支付集成琉朽。
官方給的是v3&v4支付流程毒租,簽名和加密都是在[服務(wù)器端],我們也是這樣做的,服務(wù)器做的2次簽名如下:
1箱叁、在項(xiàng)目工程Appdelegate.m文件里面添加注冊微信支付信息墅垮,注:如果項(xiàng)目中第三方分享用的是友盟,在注冊的時(shí)候要把友盟注冊放在微信注冊的前面執(zhí)行耕漱。如下:
#import "AppDelegate.h" #import "WXApi.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //注冊APP, [WXApi registerApp:@"wxb4ba3c02aa476ea1"]; return YES; } - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options { // 跳轉(zhuǎn)到URL scheme中配置的地址 //NSLog(@"跳轉(zhuǎn)到URL scheme中配置的地址-->%@",url); return [WXApi handleOpenURL:url delegate:(id<WXApiDelegate>)self]; } //支付成功時(shí)調(diào)用算色,回到第三方應(yīng)用中 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { // NSLog(@"****************url.host -- %@",url.host); if ([url.scheme isEqualToString:@"wx23a1f7f291ef4b3d"]) { return [WXApi handleOpenURL:url delegate:(id<WXApiDelegate>)self]; } return YES; }
2、給服務(wù)器發(fā)送訂單信息孤个,獲取預(yù)付訂單參數(shù),吊起微信沛简。
WechatPayViewController.m
#import "WechatPayViewController.h" #import "HYBNetworking.h" #import "WXApi.h" #import "NSString+MD5.h" @interface WechatPayViewController () //商戶關(guān)鍵信息 ,微信分配給商戶的appID,商戶號,商戶的密鑰 @property (nonatomic,strong) NSString *appId,*mchId,*spKey; @end @implementation WechatPayViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.view.backgroundColor = [UIColor greenColor]; UIButton *payButton = [UIButton buttonWithType:UIButtonTypeCustom]; payButton.center = self.view.center; payButton.bounds = CGRectMake(0, 0, 200, 200); [payButton setImage:[UIImage imageNamed:@"wechatPay_icon@2x"] forState:UIControlStateNormal]; [payButton addTarget:self action:@selector(payClick) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:payButton]; // 判斷 用戶是否安裝微信 //如果判斷結(jié)果一直為NO,可能appid無效,這里的是無效的 if([WXApi isWXAppInstalled]) { // 監(jiān)聽一個(gè)通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getOrderPayResult:) name:@"ORDER_PAY_NOTIFICATION" object:nil]; } } -(void)payClick { [self easyPay]; } /** http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php為測試數(shù)據(jù),一般可以從這兒拿 到的數(shù)據(jù)都可以讓服務(wù)器端去完成,客戶端只需獲取到然后配置到PayReq,即可吊起微信; */ -(void)easyPay { [HYBNetworking getWithUrl:@"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php" params:nil success:^(id response) { NSLog(@"%@",response); //配置調(diào)起微信支付所需要的參數(shù) PayReq *req = [[PayReq alloc] init]; req.partnerId = [response objectForKey:@"partnerid"]; req.prepayId = [response objectForKey:@"prepayid"]; req.package = [response objectForKey:@"package"]; req.nonceStr = [response objectForKey:@"noncestr"]; req.timeStamp = [[response objectForKey:@"timestamp"]intValue]; req.sign = [response objectForKey:@"sign"]; //調(diào)起微信支付 if ([WXApi sendReq:req]) { NSLog(@"吊起成功"); } } fail:^(NSError *error) { NSLog(@"%@",error); }]; } #pragma mark - 收到支付成功的消息后作相應(yīng)的處理 - (void)getOrderPayResult:(NSNotification *)notification { if ([notification.object isEqualToString:@"success"]) { NSLog(@"支付成功"); } else { NSLog(@"支付失敗"); } }
注意點(diǎn):
1齐鲤、你創(chuàng)建應(yīng)用的boundId一定要跟你項(xiàng)目中得一樣。
2椒楣、應(yīng)用跳轉(zhuǎn)不要忘記配置URL Scheme
3给郊、如果支付完成后,一直留在微信捧灰,那就檢查下URLType中的Scheme設(shè)置問題
4淆九、能夠打開微信客戶端,但是打開后只有中間一個(gè)白色的 “確定按鈕”毛俏,點(diǎn)擊后會(huì)回到客戶端上炭庙,如果是這樣,那應(yīng)該是prepayid 參數(shù)的問題煌寇,過期了焕蹄,或者不是真實(shí)的id。代碼沒有問題的阀溶。特別注意的是腻脏,微信要兩次簽名鸦泳,兩次~~~~
5、網(wǎng)上說永品、如果APP里面使用了友盟或者ShareSDK做分享做鹰,那就不用再導(dǎo)入SDK了,否則會(huì)出現(xiàn)一些詭異的問題鼎姐,例如無法調(diào)起手機(jī)微信客戶端钾麸、無法調(diào)起微信客戶端web頁面,調(diào)起了但是一閃而過症见。喂走。。這都基本上都是因?yàn)榉窒淼腟DK里面已經(jīng)包括了微信的SDK谋作。所以如果出現(xiàn)詭異的錯(cuò)誤了看看是不是兩個(gè)沖突了芋肠!我這沒有沖突,是因?yàn)樽裱粒⑿盼沂鞘謩?dòng)集成的帖池,shareSDK是pod集成的。
6吭净、微信支付的單位是分睡汹,被坑過的人都知道了!
7寂殉、二次簽名的過程:第一次簽名:客服端向服務(wù)器發(fā)起支付請求囚巴,服務(wù)器根據(jù)所必須的參數(shù)進(jìn)行一次簽名,在與微信的服務(wù)器進(jìn)行交互友扰,獲得成功地返回?cái)?shù)據(jù)彤叉,進(jìn)行第二次簽名。將信息(預(yù)付訂單參數(shù)等)返回給客戶端村怪』嘟剑客戶端在根據(jù)所獲參數(shù),將微信吊起甚负。
參考文章:
從零開始微信app支付v3-iOS版
iOS開發(fā)集成微信支付
iOS應(yīng)用之微信支付集成
擴(kuò)展文章
微信支付-簡易實(shí)例代碼(可以了解一下后臺(tái)代碼)
iOS開發(fā)傻瓜式微信支付的方法教程
iOS-微信支付流程Demo地址
如果這篇文章柬焕,對您有用,或者幫助了您梭域,請點(diǎn)??斑举,賞個(gè)冰棍吃,消消暑病涨。不瞎鬧了懂昂,共同學(xué)習(xí),如果有什么更好的建議,請?zhí)岢隽璞颍蚴怯惺裁春玫姆椒ǚ腥帷hanks!!!