1. 程式人生 > >iOS- 來和我一起搗鼓微信支付吧

iOS- 來和我一起搗鼓微信支付吧

前言:本篇文章目的在於梳理知識,鞏固思想,學習總結。本人小白一枚,走在學習的路上。有什麼好的建議,都可以留言。互相促進!

總觀,微信支付,也沒心思,好好看文件。文件微微有些亂。感覺,微信demo,內部功能都整合到一塊了,不好查詢。終於,在各種坑下,仔細看了一遍文件,默默的弄完了。

大體方向:

1.註冊微信開放平臺,建立應用獲取appid,APPSecret,申請支付功能,申請成功之後會返回一些引數.

2.下載微信支付SDK.

3.客戶端請求訂單,後臺與微信後臺互動,返回給客戶端支付引數.

4.呼叫微信客戶端,由微信客戶端和微信伺服器打交道.

5.客戶端和伺服器都會收到支付結果.

1.準備工作

(我們公司的微信支付申請是公司申請完之後,建立完應用後給我的,但是還要清楚一下大概流程)

a.註冊開發者賬號

進入微信開放平臺,註冊開發者賬號(必須申請)。申請開發者資質認證,300元一年。除了能使用微信開放平臺的一些高階功能外,可以不用認證。


開發者資質認證
開發者資質認證

b.註冊應用

拿到微信開發者賬號後,登入微信開放平臺,進入管理中心,建立新的移動應用。


註冊應用
註冊應用

建立應用我向大家都會,具體細節就不截圖了。

c. 獲取app ID和appSecret

建立成功,獲得appid和appSecret。點選檢視,如下圖。


獲取app ID和appSecret
獲取app ID和appSecret

驗證之後,會返回我們要獲得的app ID和appSecret如下圖,保留好。


驗證後獲得
驗證後獲得

d. 申請開通支付許可權

登入微信開放平臺——管理中心——建立移動應用,找到註冊的相應的應用,介面名稱——微信支付——申請開通支付去許可權。資料填寫完畢,等待稽核。

成功後,則收到一封郵件,獲得商戶號,商戶登入賬號以及登入密碼。

e. 賬戶驗證

登入微信開放平臺——管理中心,找到相對應的應用,檢視——微信支付(介面狀態—已獲得)——檢視詳情,按照它的提示步驟操作。

獲知收到的確認金,進行驗證。驗證通過,準備工作完畢。

申請開通支付許可權
申請開通支付許可權
開通微信支付,有的不一定,有的一個星期,有的很長。我也不知道大概時間,我們這個申請好長時間了。
點選-->檢視詳情(瞭解一下支付的詳情)
支付申請流程

支付申請流程
簽約
簽約

f.獲得API金鑰

f.1用獲得的商戶登入賬號和密碼
f.2登入微信商戶平臺——賬戶中心——賬戶設定——API安全——API金鑰
f.3安裝操作證書,再設定金鑰。

獲得API金鑰
獲得API金鑰
(這步千萬別忘了,其實按照郵件上的說明走就OK了。微信流程一步錯了,就容易出問題,謹記按部就班走,不要浪費沒有必要的時間,微信支付申請,基本工作準備就完畢了。)

小結:
1.建立應用獲取app IDappSecre
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 types
URL Scheme
URL 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:@"[email protected]"] 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、微信支付的單位是分,被坑過的人都知道了。。。哎!

Demo地址
如果這篇文章,對您有用,或者幫助了您,請點

相關推薦

iOS- 一起支付

前言:本篇文章目的在於梳理知識,鞏固思想,學習總結。本人小白一枚,走在學習的路上。有什麼好的建議,都可以留言。互相促進! 總觀,微信支付,也沒心思,好好看文件。文件微微有些亂。感覺,微信demo,內部功能都整合到一塊了,不好查詢。終於,在各種坑下,仔細看了一遍文件,默默的弄完了。 大體方向: 1

iOS上架技術開發合作 ios上架ma甲包 長期尋找大量技術合作,誠信優先,長期合作。歡迎了解,加求 求 1471252156 BQY970801

iOS上架技術開發合作 ios上架ma甲包 長期尋找大量技術合作,誠信優先,長期合作。歡迎來了解,加我求 求 1471252156 微信 BQY970801 iOS上架技術開發合作 ios上架ma甲包 長期尋找大量技術合作,誠信優先,長期合作。歡

開源yYmVc項目,邀您一起開發:)

bsp spring art tps 能夠 到來 b2c eas mark 打算在閑暇時間寫個MVC框架,要有什麽功能一步一步邊寫邊加,仿照struts 2 和 spring mvc。假設您感興趣的話,能夠私密我,給您加入key:)。歡迎您的到來~ 項目放在基於GIT的

是怎麼利用月收入三萬以上的!(絕對的乾貨襲!)

不知道這篇文章算不算一個乾貨分享,與其說是乾貨分享,我感覺還不如說是對我自己的一個自我介紹。首先先簡單的介紹一下我個人吧。在IT界(當然啦,是我的那個小圈子裡),大家都叫我歡子。我是一個個地地道道的農民家庭出身。在大學中誤打誤撞的被調劑到計算機專業。被調劑對大家可能算是一種不幸,但我覺得對我個人而講

一起熟悉caffe2

  caffe2 是一個深度學習架構,它提供了一種簡易快速的方法為讓你能否迅速接觸深度學習並能為社群貢獻新的演算法和模型.你可以把作品部署到有很強計算能力的GPU上,也可以把作品部署到有caffe2交叉編譯環境的手機上. caffe2和caffe相比有什麼區別呢?caffe架構的初衷是部署在大型產品上,主要

一起打造個簡單搜索之ElasticSearch集群搭建

停止 連接 gda onf -xmx elastic 分享 查看 關閉 我們所常見的電商搜索如京東,搜索頁面都會提供各種各樣的篩選條件,比如品牌、尺寸、適用季節、價格區間等,同時提供排序,比如價格排序,信譽排序,銷量排序等,方便了用戶去找到自己心裏理想的商品。 站內搜索對於

一起打造個簡單搜索之SpringDataElasticSearch關鍵詞高亮

http rms 接口 this mail ron super contex 集群 前面幾篇文章詳細講解了 ElasticSearch 的搭建以及使用 SpringDataElasticSearch 來完成搜索查詢,但是搜索一般都會有搜索關鍵字高亮的功能,今天我們把它給加上

一起打造個簡單搜索之SpringDataElasticSearch入門

() 傳遞 pub 5.7 artifact 介紹 項目 version ble 網上大多通過 java 操作 es 使用的都是 TransportClient,而介紹使用 SpringDataElasticSearch 的文章相對比較少,筆者也是摸索了許久,接下來本文介紹

一起打造個簡單搜索之ElasticSearch入門

agg tle 節點 strong try 針對 ras 技術分享 學習 本文簡單介紹了使用 Rest 接口,對 es 進行操作,更深入的學習,可以參考文末部分。 環境 本文以及後續 es 系列文章都基於 5.5.3 這個版本的 elasticsearch ,這個版本比較

一起打造個簡單搜索之IK分詞以及拼音分詞

生產環境 ast ken ade usr block analyzer osi 繼續 elasticsearch 官方默認的分詞插件,對中文分詞效果不理想,它是把中文詞語分成了一個一個的漢字。所以我們引入 es 插件 es-ik。同時為了提升用戶體驗,引入 es-pinyi

一起打造個簡單搜尋之Logstash實時同步建立索引

用過 Solr 的朋友都知道,Solr 可以直接在配置檔案中配置資料庫連線從而完成索引的同步建立,但是 ElasticSearch 本身並不具備這樣的功能,那如何建立索引呢?方法其實很多,可以使用 Java API 的方式建立索引,也可以通過 Logstash 的外掛 logstash-input-jdbc

一起打造個簡單搜尋之IK分詞以及拼音分詞

elasticsearch 官方預設的分詞外掛,對中文分詞效果不理想,它是把中文詞語分成了一個一個的漢字。所以我們引入 es 外掛 es-ik。同時為了提升使用者體驗,引入 es-pinyin 外掛。本文介紹這兩個 es 外掛的安裝。 環境 本文以及後續 es 系列文章都基於 5.5.3 這個版本的 el

一起打造個簡單搜尋之ElasticSearch叢集搭建

我們所常見的電商搜尋如京東,搜尋頁面都會提供各種各樣的篩選條件,比如品牌、尺寸、適用季節、價格區間等,同時提供排序,比如價格排序,信譽排序,銷量排序等,方便了使用者去找到自己心裡理想的商品。 站內搜尋對於一個網站幾乎是標配,只是搜尋的強大與否的區別,有的網站只支援關鍵詞模糊搜尋,而淘寶,京東提供了精細的篩選

一起打造個簡單搜尋之ElasticSearch入門

本文簡單介紹了使用 Rest 介面,對 es 進行操作,更深入的學習,可以參考文末部分。 環境 本文以及後續 es 系列文章都基於 5.5.3 這個版本的 elasticsearch ,這個版本比較穩定,可以用於生產環境。 系列文章 一、和我一起打造個簡單搜尋之ElasticSearch叢集搭建

一起打造個簡單搜索之Logstash實時同步建立索引

為什麽 ring 消失 放心 小雷 的人 現在 .net intro 用過 Solr 的朋友都知道,Solr 可以直接在配置文件中配置數據庫連接從而完成索引的同步創建,但是 ElasticSearch 本身並不具備這樣的功能,那如何建立索引呢?方法其實很多,可以使用 Jav

ios支付字串轉json物件

幫朋友做個小活,微信支付的前期工作就不說了,網上一找一大把。就是伺服器發過來的json字串轉成json物件稍微卡了下。 程式碼如下: void IosHelper::startWeiXinPay(const char *pStr) { if(pStr == nil)

React Native (IOSAndroid) 支付支付整合實戰(支付寶Android篇)

序言:React Native無論是在社群和應用程度上,在國內外是十分廣泛和普及的。而支付寶和微信在支付模組上都有或多或少的支援,雖然沒有完整的Demo,不過在我做過一個相關整合的專案後,在此我把相關的步驟和方法總結出來和大家分享,希望能夠幫助大家少走彎路,快速整合。 支付

一起入坑-React-Native-加入Redux的TodoList

讀前須知 這個專案是第一次使用Redux的例項,並不具有專業性的理論知識。純粹分享一次開發過程與心得。之前寫了一篇沒有加入Redux的React Native ToDoList的小博文。這個專案也是在原來的基礎上進行裝修完成的。目的是為了體驗一下高深莫測的Redux

我們一起玩耍

HashiCorpChina社群還處於起步階段。目前的主要目的就是聚集一下HashiCorp產品(Vagrant、Packer、Terraform、Vault、Namad和Consul)的使用者以及相關領域的大牛,能夠和我們公司本部的技術人員們直接進行交流和資訊共享。我們最大的願望是能讓中國的使用者

一起搭建私有物聯網雲平臺

和我一起搭建私有物聯網雲平臺   背景(不看也罷) “預計2020年全球的物聯網裝置將達到500億臺”這句話已經被我無恥地在各種材料、PPT中引用過無數次了,但這並不妨礙物聯網已經成為或即將成為下一個浪潮之巔的事實,各大、小公司都想借助物聯網的風口再起飛一波。於是,很多公司紛紛