微信支付

官方建議使用服務器簽名來接入微信支付,從安全上考慮,客戶端不應該知道RAS密鑰,也不需要每個客戶端都寫一遍簽名的算法。

前言

申請開通微信支付功能,需要認證開發者資質300/次,微信發郵件給API參數表。后面的代碼當中的APPID 為測試代碼的APPID.


參數

支付流程

  1. 導入支付SDK,注冊微信支付
  • Info.plist中增加如下代碼
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
  • 導入第三方框架和鏈接庫
 Security.framework
CoreTelephony.framework
SystemConfiguration.framework
libc++.tbd
lib.tbd
libsqlite3.tbd
libWeChatSDK.a
  • APPID設置為URL Schemes


    URL Schemes
  • 在AppDelegate中注冊
  //注冊微信
    -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
         //向微信注冊wxd930ea5d5a258f4f
         [WXApi registerApp:@"wxb4ba3c02aa476ea1" withDescription:@"demo 2.0"];
         return YES;
}
//設置代理
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
        return  [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
        return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
  1. 發起支付
-(IBAction)weixinPayAction:(UIButton *)sender {
    //先判斷是否安裝微信或是否支持微信支付
    if (![WXApi isWXAppInstalled])
        return ;
   if (![WXApi isWXAppSupportApi])
        return ;
   //向后臺請求數據
    [self PayAction];  
}
-(NSString*)PayAction{
    NSString *urlString   = @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios";
    //解析服務端返回json數據
    NSError *error;
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
    NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    if ( response != nil) {
        NSMutableDictionary *dict = NULL;
        dict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
        if(dict != nil){            
            NSMutableString *retcode = [dict objectForKey:@"retcode"];
            if (retcode.intValue == 0){            
                //調起微信支付
              PayReq* req   = [[PayReq alloc] init];   
              //微信號和AppID組成的唯一標識,發送請求時第三方程序必須填寫,
              //用于校驗微信用戶是否換號登錄 
              req.openID    = [dict objectForKey:@"openID"];  //商戶 
              req.partnerId = [dict objectForKey:@"partnerid"];  //商戶號ID
              req.prepayId  = [dict objectForKey:@"prepayid"];//預支付交易ID
              req.nonceStr  = [dict objectForKey:@"noncestr"]; //隨機字符串
              req.timeStamp = [dict objectForKey:@"timestamp"].intValue;//時間戳
              req.sign      = [dict objectForKey:@"sign"]; //簽名
              req.package   = [dict objectForKey:@"package"];//擴展字段,固定值@“Sign=WXPay”
              [WXApi sendReq:req];

                return @"一切OK";
            }else{
                return [dict objectForKey:@"retmsg"];
            }
        }else{
            return @"服務器返回錯誤,未獲取到json對象";
        }
    }else{
        return @"服務器返回錯誤";
    }
}
  1. 處理微信支付返回信息
- (void)onResp:(BaseResp *)resp {
   if([resp isKindOfClass:[PayResp class]]){
        //支付返回結果,實際支付結果需要去微信服務器端查詢
        switch (resp.errCode) {
            case WXSuccess:
                NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
                break;
            default:                
                NSLog(@"錯誤,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
                break;
        }
  }
}

微信文檔
參考文檔0
參考文檔1

商戶系統和微信支付系統主要交互說明:

步驟1:用戶在商戶APP中選擇商品,提交訂單,選擇微信支付。

步驟2:商戶后臺收到用戶支付單,調用微信支付****統一下單接口****。

步驟3:統一下單接口返回正常的prepay_id,再按簽名規范重新生成簽名后,將數據傳輸給APP。參與簽名的字段名為appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式為Sign=WXPay

步驟4:商戶APP調起微信支付

步驟5:商戶后臺接收支付通知。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內容

  • 前言:本篇文章目的在于梳理知識,鞏固思想,學習總結。有什么好的建議,都可以留言。互相促進!總觀,微信支付,也沒心思...
    麥穗0615閱讀 10,075評論 8 70
  • 自己總結的微信支付寶支付流程和注意點: 準備工作: 需要公司的營業執照,稅務信息,等老板的身份證信息等,我記得,用...
    Www劉閱讀 18,576評論 2 50
  • 目前項目里有微信支付的需求,調研過一段時間后,發現其實并沒有想象中的那么困難。如果你只是想實現該功能,一個方法足以...
    劉光軍_MVP閱讀 1,463評論 0 7
  • 實現支付寶支付的準備工作: 1.向支付寶簽約,成為支付寶的商戶 簽約完成后,支付寶會提供一些必要的數據給我們 商戶...
    Anson楊春安閱讀 8,243評論 0 6
  • <一>、添加微信sdk 把微信sdk下載下來,然后會報錯,這時需要去Target中的Link Binary Wit...
    請叫我平爺閱讀 1,935評論 0 7