APP接入微信支付流程

最近的一個項目涉及到支付,這裏就先說一下微信支付,像微信開發者申請,APP申請相信大家都非常熟悉,設計到支付,還需要申請支付功能,按照微信所要求的提供相關材料即可,接下來就等待審覈結果吧。

微信支付流程及注意事項:

一.所需導入的類庫

1.導入微信SDK

直接將微信SDK拉入工程即可,若使用了其他第三方如友盟,則可以忽略,因爲友盟已經包含微信支付所需的相關文件,如下圖


2.導入需要類庫:根據微信開發文檔

Security.framework
CoreTelephony.framework
SystemConfiguration.framework
libz.dylib
libsqlite3.0.dylib
UIKit.framework
Foundation.framework

// 微信官方的庫
libWeChatSDK.a

二.注意事項

1.urlschemes 的設置

2.微信app的白名單加入

如果APP只涉及支付,不涉及第三方登錄分享,這兩個切記不要忘記填寫

三.所需更改的文件

1.AppDelegate.h
導入#import "WXApi.h"當然還有<WXApiDelegate>
在didFinishLaunchingWithOptions 方法中初始化微信支付
[WXApi registerApp:@"你在微信開發者平臺註冊的APPId"];

在以下方法回調:
- (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]];
}


#pragma mark - WXApiDelegate
-(void)onResp:(BaseResp *)resp {
    if ([resp isKindOfClass:[PayResp class]]) {
        PayResp*response=(PayResp*)resp;  // 微信終端返回給第三方的關於支付結果的結構體
        switch (response.errCode) {
            case WXSuccess:
            {// 支付成功,向後臺發送消息
                NSLog(@"支付成功");
                [[NSNotificationCenter defaultCenter] postNotificationName:@"WeiXinPaysucceed" object:nil userInfo:nil];
            }
                break;
            case WXErrCodeCommon:
            { //簽名錯誤、未註冊APPID、項目設置APPID不正確、註冊的APPID與設置的不匹配、其他異常等
                [SVProgressHUD showErrorWithStatus:@"支付失敗"];
                NSLog(@"支付失敗");
            }
                break;
            case WXErrCodeUserCancel:
            { //用戶點擊取消並返回
                NSLog(@"取消支付");
                [SVProgressHUD showErrorWithStatus:@"取消支付"];
            }
                break;
            case WXErrCodeSentFail:
            { //發送失敗
                NSLog(@"發送失敗");
                [SVProgressHUD showErrorWithStatus:@"發送失敗"];
            }
                break;
            case WXErrCodeUnsupport:
            { //微信不支持
                NSLog(@"微信不支持");
                [SVProgressHUD showErrorWithStatus:@"微信不支持"];
            }
                break;
            case WXErrCodeAuthDeny:
            { //授權失敗
                NSLog(@"授權失敗");
                [SVProgressHUD showErrorWithStatus:@"授權失敗"];
            }
                break;
            default:
                break;
        }
    }
}
2.在支付頁面

導入#import "WXApi.h",#import "WXApiObject.h",注意代理<WXApiDelegate>

在微信支付的地方調用,所需參數有服務器提供

           PayReq *request = [[PayReq alloc]init];
            //商家id
            request.partnerId = MCH_id;
            request.partnerId = self.payDic[@"partnerid"];
            //訂單id
            request.prepayId = self.payDic[@"prepayid"];
            //擴展字段(官方文檔:暫時填寫固定值)
            request.package = @"Sign=WXPay";
            //隨機字符串 noncestr
            request.nonceStr = self.payDic[@"noncestr"];
            //時間戳
            request.timeStamp = [self.payDic[@"timestamp"] intValue];
//
            //sign參數(很經常出現的問題:就是調起支付到微信那邊只出現一個確定按鈕,單擊確認按鈕直接返回到app,出現這個問題100%是sign參數的問題)
            //參數依次是: appid_key、partnerid_key、prepayid_key、固定值Sign=WXPay、預支付的隨機數(跟上面得到預支付訂單的隨機數要一致)、支付時間(秒)
//            request.sign = self.payDic[@"sign"];
        
            request.sign = self.payDic[@"sign"];
            NSLog(@"sign是%@",request.sign);
//調用微信支付         

   [WXApi sendReq:request];

不管是否支付,都會向服務器返回一條信息在AppDelegate.m微信代理方法中可詳細查看

回調中errCode值列表:

名稱 描述 解決方案
0 成功 展示成功頁面
-1 錯誤 可能的原因:簽名錯誤、未註冊APPID、項目設置APPID不正確、註冊的APPID與設置的不匹配、其他異常等。
-2 用戶取消 無需處理。發生場景:用戶不支付了,點擊取消,返回APP。

四.支付流程解析

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

步驟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

交互時序圖






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章