iOS- 微信支付總結(jié)

前言:本篇文章目的在于梳理知識篡殷,鞏固思想变勇,學(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)證蕾殴。


開發(fā)者資質(zhì)認(rèn)證

b.注冊應(yīng)用

拿到微信開發(fā)者賬號后笑撞,登錄微信開放平臺(tái),進(jìn)入管理中心区宇,創(chuàng)建新的移動(dòng)應(yīng)用娃殖。


注冊應(yīng)用

創(chuàng)建應(yīng)用我向大家都會(huì),具體細(xì)節(jié)就不截圖了议谷。

c. 獲取app ID和appSecret

創(chuàng)建成功炉爆,獲得appid和appSecret。點(diǎn)擊查看,如下圖芬首。


獲取app ID和appSecret

驗(yàn)證之后赴捞,會(huì)返回我們要獲得的app ID和appSecret如下圖,保留好郁稍。


驗(yàn)證后獲得

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)備工作完畢。

申請開通支付權(quán)限

開通微信支付典徊,有的不一定竟趾,有的一個(gè)星期,有的很長宫峦。我也不知道大概時(shí)間岔帽,我們這個(gè)申請好長時(shí)間了。
點(diǎn)擊-->查看詳情(了解一下支付的詳情)
支付申請流程

簽約

f.獲得API密鑰

f.1用獲得的商戶登錄賬號和密碼
f.2登錄微信商戶平臺(tái)——賬戶中心——賬戶設(shè)置——API安全——API密鑰
f.3安裝操作證書导绷,再設(shè)置密鑰犀勒。

獲得API密鑰

(這步千萬別忘了,其實(shí)按照郵件上的說明走就OK了妥曲。微信流程一步錯(cuò)了贾费,就容易出問題,謹(jǐn)記按部就班走檐盟,不要浪費(fèi)沒有必要的時(shí)間褂萧,微信支付申請,基本工作準(zhǔn)備就完畢了葵萎。)

小結(jié):
1.創(chuàng)建應(yīng)用獲取app IDappSecre
2.開通支付功能
3.獲取郵件里商戶號和賬號密碼
4.商戶平臺(tái)导犹,下載證書唱凯,獲得api秘鑰

補(bǔ)充:創(chuàng)建移動(dòng)應(yīng)用并成功之后會(huì)受到騰訊發(fā)來的郵件如下

郵件內(nèi)容

注意:
通過郵件我們能獲得重要的參數(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
URL Scheme
  • 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!!!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市铲敛,隨后出現(xiàn)的幾起案子褐澎,更是在濱河造成了極大的恐慌,老刑警劉巖伐蒋,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件工三,死亡現(xiàn)場離奇詭異,居然都是意外死亡先鱼,警方通過查閱死者的電腦和手機(jī)俭正,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焙畔,“玉大人掸读,你說我怎么就攤上這事『甓啵” “怎么了儿惫?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長伸但。 經(jīng)常有香客問我肾请,道長,這世上最難降的妖魔是什么更胖? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任铛铁,我火速辦了婚禮,結(jié)果婚禮上却妨,老公的妹妹穿的比我還像新娘饵逐。我一直安慰自己,他們只是感情好管呵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布梳毙。 她就那樣靜靜地躺著哺窄,像睡著了一般捐下。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萌业,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天坷襟,我揣著相機(jī)與錄音,去河邊找鬼生年。 笑死婴程,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抱婉。 我是一名探鬼主播档叔,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼桌粉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了衙四?” 一聲冷哼從身側(cè)響起铃肯,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎传蹈,沒想到半個(gè)月后押逼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惦界,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年挑格,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沾歪。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡漂彤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瞬逊,到底是詐尸還是另有隱情显歧,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布确镊,位于F島的核電站士骤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蕾域。R本人自食惡果不足惜拷肌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旨巷。 院中可真熱鬧巨缘,春花似錦、人聲如沸采呐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斧吐。三九已至又固,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間煤率,已是汗流浹背仰冠。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蝶糯,地道東北人洋只。 一個(gè)月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親识虚。 傳聞我的和親對象是個(gè)殘疾皇子肢扯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容