2020微信支付接入

最近有了點(diǎn)時(shí)間整理一下最新的微信支付接入的主要事項(xiàng),以免后面踩坑。
我這里寫的是把主要業(yè)務(wù)邏輯都放后臺(tái)實(shí)現(xiàn)的方法,移動(dòng)端直接調(diào)接口就行了,也是官方推薦的方法。
關(guān)于支付寶支付
先上官方文檔:
APP端開發(fā)步驟官方文檔
iOS接入指南官方文檔
下面這個(gè)是自己關(guān)于Universal Links的一點(diǎn)小總結(jié)
關(guān)于Universal Links
三個(gè)結(jié)合一起看應(yīng)該就沒得啥大問題了。下面是一些代碼方面的補(bǔ)充。

先到微信開放平臺(tái)-管理中心-應(yīng)用詳情,獲取一些之前注冊(cè)后生成的數(shù)據(jù)。
如圖:


截屏2020-07-10上午10.33.27.png

截屏2020-07-10上午10.34.51.png

在添加好白名單,Universal Links,Url Schemes之后就可以開始寫代碼了。

在 1:AppDelegate 的 didFinishLaunchingWithOptions 函數(shù)中向微信注冊(cè) id

#import <UIKit/UIKit.h>
#import "WXApi.h"

@interface AppDelegate : UIResponder<UIApplicationDelegate, WXApiDelegate>

@property (strong, nonatomic) UIWindow *window;

@end
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //向微信注冊(cè)
    //[WXApi registerApp:您的APP_ID enableMTA:YES];//sdk:1.8.6-
    [WXApi registerApp:您的APP_ID universalLink:您的UNIVERSAL_LINK];//sdk:1.8.6+
    return YES;
}
    

2:重寫 AppDelegate 的 handleOpenURL 和 openURL 方法:

//ios9之后已經(jīng)棄用
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return  [WXApi handleOpenURL:url delegate:self];
}

/**
iOS9以后該方法已經(jīng)廢棄,用一下方法替代
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [WXApi handleOpenURL:url delegate:self];
}
*/
//iOS9之后的的方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options
{
   return [WXApi handleOpenURL:url delegate:self];
}

3:重寫AppDelegate或SceneDelegate的continueUserActivity方法: 注意:適配了SceneDelegate的App,系統(tǒng)將會(huì)回調(diào)SceneDelegate的continueUserActivity方法,所以需要重寫SceneDelegate的該方法。(微信支付SDK1.8.6+才調(diào)用這個(gè)代理方法)

//AppDelegate:
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler {
    return [WXApi handleOpenUniversalLink:userActivity delegate:self];
}

/**
 SceneDelegate:中調(diào)用
 */
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {
    [WXApi handleOpenUniversalLink:userActivity delegate:self];
}

4:現(xiàn)在,你的程序要實(shí)現(xiàn)和微信終端交互的具體請(qǐng)求與回應(yīng),因此需要實(shí)現(xiàn) WXApiDelegate 協(xié)議的兩個(gè)方法:

-(void) onReq:(BaseReq*)reqonReq
{
    NSlog(@"微信支付回調(diào)");
}
/**照微信SDK Sample,在類實(shí)現(xiàn)onResp函數(shù),支付完成后,微信APP會(huì)返回到商戶APP并回調(diào)onResp函數(shù),開發(fā)者需要在該函數(shù)中接收通知,判斷返回錯(cuò)誤碼,如果支付成功則去后臺(tái)查詢支付結(jié)果再展示用戶實(shí)際支付結(jié)果。注意 一定不能以客戶端返回作為用戶支付的結(jié)果,應(yīng)以服務(wù)器端的接收的支付通知或查詢API返回的結(jié)果為準(zhǔn)。代碼示例如下
  0:成功,成功展示頁面
 -1:錯(cuò)誤,可能的原因:簽名錯(cuò)誤、未注冊(cè)APPID、項(xiàng)目設(shè)置APPID不正確、注冊(cè)的APPID與設(shè)置的不匹配、其他異常等。
 -2:用戶取消,無需處理。發(fā)生場(chǎng)景:用戶不支付了,點(diǎn)擊取消,返回APP。
*/
-(void)onResp:(BaseResp*)resp{
  if ([respisKindOfClass:[PayRespclass]]){
      PayResp*response=(PayResp*)resp;
      switch(response.errCode){
          caseWXSuccess:
                    //服務(wù)器端查詢支付通知或查詢API返回的結(jié)果再提示成功
                    NSlog(@"支付成功");
            break;
            default:
            NSlog(@"支付失敗,retcode=%d",resp.errCode);
            break;
      }
        }
    }

然后你代碼中業(yè)務(wù)邏輯的位置

1:想后臺(tái)提交支付清單獲取訂單編號(hào):orderNo
2:點(diǎn)擊微信支付按鈕的時(shí)候判斷是否安裝了微信

if (![WXApi isWXAppInstalled]) {//未安裝支付
                [self showAlert:@"您還為安裝微信"];
            }else{//已經(jīng)安裝微信
               //繼續(xù)進(jìn)行微信支付,給后臺(tái)傳訂單號(hào)
            }

3:給后臺(tái)傳訂單編號(hào):orderNo,獲取微信支付相關(guān)數(shù)據(jù):PayReq。

/*! @brief 第三方向微信終端發(fā)起支付的消息結(jié)構(gòu)體
 *
 *  第三方向微信終端發(fā)起支付的消息結(jié)構(gòu)體,微信終端處理后會(huì)向第三方返回處理結(jié)果
 * @see PayResp
 */
@interface PayReq : BaseReq

/** 商家向財(cái)付通申請(qǐng)的商家id */
@property (nonatomic, copy) NSString *partnerId;
/** 預(yù)支付訂單 */
@property (nonatomic, copy) NSString *prepayId;
/** 隨機(jī)串,防重發(fā) */
@property (nonatomic, copy) NSString *nonceStr;
/** 時(shí)間戳,防重發(fā) */
@property (nonatomic, assign) UInt32 timeStamp;
/** 商家根據(jù)財(cái)付通文檔填寫的數(shù)據(jù)和簽名 */
@property (nonatomic, copy) NSString *package;
/** 商家根據(jù)微信開放平臺(tái)文檔對(duì)數(shù)據(jù)做的簽名 */
@property (nonatomic, copy) NSString *sign;

@end

4:喚起支付界面開始支付

#pragma mark - 調(diào)起微信支付頁面
- (void)sendWeiChatPay
{
    //接收后臺(tái)傳回的數(shù)據(jù)后,裝入model,將model中的數(shù)據(jù)傳給req
                
    PayReq* req             = [[PayReq alloc] init];
    req.partnerId           = self.model.partnerid;/** 商家向財(cái)付通申請(qǐng)的商家id */
    req.prepayId            = self.model.prepayid;/** 預(yù)支付訂單 */
    req.nonceStr            = self.model.noncestr;/** 隨機(jī)串,防重發(fā) */
    NSString *str = self.model.timeStamp;//NSString 轉(zhuǎn) UInt32
    UInt32 num;
    sscanf([str UTF8String], "%u", &num);
    req.timeStamp           = num;/** 時(shí)間戳,防重發(fā),UInt32類型 */
    req.package             = self.model.package;/** 商家根據(jù)財(cái)付通文檔填寫的數(shù)據(jù)和簽名 */
    req.sign                = self.model.sign;/** 商家根據(jù)微信開放平臺(tái)文檔對(duì)數(shù)據(jù)做的簽名 */
    
/*兩個(gè)自檢函數(shù),測(cè)完沒得問題就注釋掉,這里有個(gè)坑,這兩個(gè)自檢函數(shù)如果和調(diào)起微信支付函數(shù)同時(shí)存在的話,支付結(jié)果會(huì)返回“未知的應(yīng)用請(qǐng)求”導(dǎo)致支付不成功
[WXApi startLogByLevel:WXLogLevelDetail logBlock:^(NSString *log) {
        NSLog(@"WeChatSDK+++++++++++: %@", log);
    }];
    //調(diào)用自檢函數(shù)
    [WXApi checkUniversalLinkReady:^(WXULCheckStep step, WXCheckULStepResult* result) {
        NSLog(@"step-----: %@, result.success---------: %u, result.errorInfo-------: %@, result.suggestion-----: %@", @(step), result.success, result.errorInfo, result.suggestion);
    }];
*/
    [WXApi sendReq:req];//調(diào)起微信支付1.8.6-
/*調(diào)起微信支付1.8.6+
    [WXApi sendReq:req completion:^(BOOL success) {
        if (success) {
            PHlog(@"--------: %@",@"支付成功");
         
        }else{
            PHlog(@"--------: %@",@"失敗");
        }
    }];
    */
}

最后向后臺(tái)確認(rèn)支付結(jié)果。
需要swift版本的請(qǐng)參考swift版本

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容