前言:本篇文章目的在于梳理知識,鞏固思想,學習總結。有什么好的建議,都可以留言。互相促進!
總觀,微信支付,也沒心思,好好看文檔。文檔微微有些亂。感覺,微信demo,內部功能都集成到一塊了,不好查找。終于,在各種坑下,仔細看了一遍文檔,默默的弄完了。
會用到的網址如下:
微信開放平臺
微信商戶平臺
iOS微信支付在線文檔
SDK集成文檔大體方向:
1.注冊微信開放平臺,創建應用獲取appid,APPSecret,申請支付功能,申請成功之后會返回一些參數.
2.下載微信支付SDK.
3.客戶端請求訂單,后臺與微信后臺交互,返回給客戶端支付參數.
4.調用微信客戶端,由微信客戶端和微信服務器打交道.
5.客戶端和服務器都會收到支付結果.
1.準備工作
(我們公司的微信支付申請是公司申請完之后,創建完應用后給我的,但是還要清楚一下大概流程)
a.注冊開發者賬號
進入微信開放平臺,注冊開發者賬號(必須申請)。申請開發者資質認證,300元一年。除了能使用微信開放平臺的一些高級功能外,可以不用認證。
開發者資質認證b.注冊應用
拿到微信開發者賬號后,登錄微信開放平臺,進入管理中心,創建新的移動應用。
注冊應用
創建應用我向大家都會,具體細節就不截圖了。
c. 獲取app ID和appSecret
創建成功,獲得appid和appSecret。點擊查看,如下圖。
獲取app ID和appSecret
驗證之后,會返回我們要獲得的app ID和appSecret如下圖,保留好。
驗證后獲得d. 申請開通支付權限
登錄微信開放平臺——管理中心——創建移動應用,找到注冊的相應的應用,接口名稱——微信支付——申請開通支付去權限。資料填寫完畢,等待審核。
成功后,則收到一封郵件,獲得商戶號,商戶登錄賬號以及登錄密碼。
e. 賬戶驗證
登錄微信開放平臺——管理中心,找到相對應的應用,查看——微信支付(接口狀態—已獲得)——查看詳情,按照它的提示步驟操作。
獲知收到的確認金,進行驗證。驗證通過,準備工作完畢。
申請開通支付權限
開通微信支付,有的不一定,有的一個星期,有的很長。我也不知道大概時間,我們這個申請好長時間了。
點擊-->查看詳情(了解一下支付的詳情)
支付申請流程
簽約f.獲得API密鑰
f.1用獲得的商戶登錄賬號和密碼
f.2登錄微信商戶平臺——賬戶中心——賬戶設置——API安全——API密鑰
f.3安裝操作證書,再設置密鑰。
獲得API密鑰
(這步千萬別忘了,其實按照郵件上的說明走就OK了。微信流程一步錯了,就容易出問題,謹記按部就班走,不要浪費沒有必要的時間,微信支付申請,基本工作準備就完畢了。)小結:
1.創建應用獲取app ID和appSecre
2.開通支付功能
3.獲取郵件里商戶號和賬號密碼
4.商戶平臺,下載證書,獲得api秘鑰補充:創建移動應用并成功之后會受到騰訊發來的郵件如下
郵件內容
注意:
通過郵件我們能獲得重要的參數:
(1):AppID
(2):微信支付商戶號
(3):前往商戶平臺完成入駐
(4):API秘鑰(自己設置即可,注意一定要32位字母加數字的組合)記得保存好秘鑰,以后要使用。$_$; 有了這些參數后,我們就可以開發自己的項目了。
2. SDK集成及環境配置
下面讓我們一起創建工程,一起去集成微信支付的SDK吧。下載地址如下:
官方SDK及Demo下載地址
如上圖,SDK版本1.7.9,ios9_v3_pay
1.將我們下載的SDK導入我們的工程。
2.在Target —> General —> Link Binary With Libraries— 點擊+號 -> 搜索你需要的系統庫,如下:
SystemConfiguration.framework libz.tbd libsqlite3.0.tbd CoreTelephony.framework QuartzCore.framework
添加依賴庫
- 3 設置URL Scheme:為了app之間的跳轉
在注冊微信平臺APP的時候,會給一個唯一識別標識符(APPID)。
這里的url schemes就填在微信開發平臺申請的appID
打開工程->info->URL typesURL Scheme
- 4.配置白名單(貌似不配置白名單也能跳轉,但還是寫全了為妙)。
或者info.plist右鍵->source code打開添加下面這段代碼<key>LSApplicationQueriesSchemes</key>
<array><string>wechat</string>
<string>weixin </string>
</array>
4.有的時候會出現莫名奇妙的問題例如下面:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM enqueue:]: unrecognized selector sent to instance 0x60000024ef40'在buddle Seeting 里面的Other Linker Flags 中添加-ObjC就可以了。
Com + R,如果不出什么問題,基本上就集成完畢了,環境也配置好呢。
3.代碼布局吊起微信支付
在吊起微信之前,必須要知道微信支付是一個怎么樣的過程。
【了解一下-官方流程】
商戶系統和微信支付系統主要交互說明:
步驟1:用戶在商戶APP中選擇商品,提交訂單,選擇微信支付。
步驟2:商戶后臺收到用戶支付單,調用微信支付統一下單接口。參見【統一下單API】。
步驟3:統一下單接口返回正常的prepay_id,再按簽名規范重新生成簽名后,將數據傳輸給APP。參與簽名的字段名為appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式為Sign=WXPay
步驟4:商戶APP調起微信支付。api參見本章節【app端開發步驟說明】
步驟5:商戶后臺接收支付通知。api參見【支付結果通知API】
步驟6:商戶后臺查詢支付結果。,api參見【查詢訂單API】【網上好的流程分享】
1、用戶使用APP客戶端,選擇商品下單。
2、商戶客戶端(就是你做的APP)將用戶的商品數據傳給商戶服務器,請求生成支付訂單。
3、商戶后臺調用統一下單API向微信的服務器發送請求,微信服務器生成預付單,并生成一個prepay_id返回給商戶后臺。
4、商戶后臺將這個prepay_id返回給商戶客戶端。
5、用戶點擊確認支付,這時候商戶客戶端調用SDK打開微信客戶端,進行微信支付。
6、微信客戶端向微信服務器發起支付請求并返回支付結果(他們之間交互用的就是prepay_id這個參數,微信的服務器要驗證微信客戶端傳過去的參數是否跟第三步中生成的那個id一致)。
7、用戶輸入支付密碼后,微信客戶端提交支付授權,跟微信服務器交互,完成支付。
8、微信服務器給微信客戶端發送支付結果提示,并異步給商戶服務器發送支付結果通知。
9、商戶客戶端通過支付結果回調接口查詢支付結果,并向后臺檢查支付結果是否正確,后臺返回支付結果。
10、商戶客戶端顯示支付結果,完成訂單,發貨。
客戶端主要工作
1.調起微信客戶端發起支付 2.顯示支付結果
吊起準備
調用微信支付前,需要下單、簽名等操作,以便獲取微信支付所必要的參數。為了提高安全性,下單、簽名操作一般是在后臺完成。
需要的參數包括:appid、partid(商戶號)、prepayid(預支付訂單ID)、noncestr(參與簽名的隨機字符串)、timestamp(參與簽名的時間戳)、sign(簽名字符串)這六個。
[代碼示例①:]
如果所有信息的生成都在前端完成,包括對訂單進行sign簽名以及MD5簽名加密(此方法相對來說有些復雜,沒有官方給的方法簡單)您可以看參考文章iOS應用之微信支付集成。
官方給的是v3&v4支付流程,簽名和加密都是在[服務器端],我們也是這樣做的,服務器做的2次簽名如下:
1、在項目工程Appdelegate.m文件里面添加注冊微信支付信息,注:如果項目中第三方分享用的是友盟,在注冊的時候要把友盟注冊放在微信注冊的前面執行。如下:
#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 { // 跳轉到URL scheme中配置的地址 //NSLog(@"跳轉到URL scheme中配置的地址-->%@",url); return [WXApi handleOpenURL:url delegate:(id<WXApiDelegate>)self]; } //支付成功時調用,回到第三方應用中 - (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、給服務器發送訂單信息,獲取預付訂單參數,吊起微信。
WechatPayViewController.m
#import "WechatPayViewController.h" #import "HYBNetworking.h" #import "WXApi.h" #import "NSString+MD5.h" @interface WechatPayViewController () //商戶關鍵信息 ,微信分配給商戶的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]; // 判斷 用戶是否安裝微信 //如果判斷結果一直為NO,可能appid無效,這里的是無效的 if([WXApi isWXAppInstalled]) { // 監聽一個通知 [[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為測試數據,一般可以從這兒拿 到的數據都可以讓服務器端去完成,客戶端只需獲取到然后配置到PayReq,即可吊起微信; */ -(void)easyPay { [HYBNetworking getWithUrl:@"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php" params:nil success:^(id response) { NSLog(@"%@",response); //配置調起微信支付所需要的參數 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"]; //調起微信支付 if ([WXApi sendReq:req]) { NSLog(@"吊起成功"); } } fail:^(NSError *error) { NSLog(@"%@",error); }]; } #pragma mark - 收到支付成功的消息后作相應的處理 - (void)getOrderPayResult:(NSNotification *)notification { if ([notification.object isEqualToString:@"success"]) { NSLog(@"支付成功"); } else { NSLog(@"支付失敗"); } }
注意點:
1、你創建應用的boundId一定要跟你項目中得一樣。
2、應用跳轉不要忘記配置URL Scheme
3、如果支付完成后,一直留在微信,那就檢查下URLType中的Scheme設置問題
4、能夠打開微信客戶端,但是打開后只有中間一個白色的 “確定按鈕”,點擊后會回到客戶端上,如果是這樣,那應該是prepayid 參數的問題,過期了,或者不是真實的id。代碼沒有問題的。特別注意的是,微信要兩次簽名,兩次~~~~
5、網上說、如果APP里面使用了友盟或者ShareSDK做分享,那就不用再導入SDK了,否則會出現一些詭異的問題,例如無法調起手機微信客戶端、無法調起微信客戶端web頁面,調起了但是一閃而過。。。這都基本上都是因為分享的SDK里面已經包括了微信的SDK。所以如果出現詭異的錯誤了看看是不是兩個沖突了!我這沒有沖突,是因為,微信我是手動集成的,shareSDK是pod集成的。
6、微信支付的單位是分,被坑過的人都知道了!
7、二次簽名的過程:第一次簽名:客服端向服務器發起支付請求,服務器根據所必須的參數進行一次簽名,在與微信的服務器進行交互,獲得成功地返回數據,進行第二次簽名。將信息(預付訂單參數等)返回給客戶端。客戶端在根據所獲參數,將微信吊起。
參考文章:
從零開始微信app支付v3-iOS版
iOS開發集成微信支付
iOS應用之微信支付集成
擴展文章
微信支付-簡易實例代碼(可以了解一下后臺代碼)
iOS開發傻瓜式微信支付的方法教程
iOS-微信支付流程Demo地址
如果這篇文章,對您有用,或者幫助了您,請點??,賞個冰棍吃,消消暑。不瞎鬧了,共同學習,如果有什么更好的建議,請提出,或是有什么好的方法。thanks!!!