微信支付iOS整合與二次封裝
最近在進行的專案,需要整合第三方支付。業務需要整合支付寶,微信,銀聯,Paypal等支付方式。在使用各家sdk時會發現有些第三方sdk呼叫時不夠方便,簡單。所以就有了進行再次封裝的想法。
已經發布過關於支付寶支付的二次封裝,如果對文章感興趣,可以移步到支付寶iOS整合與二次封裝 查閱。
官方下載與整合相關文件
下載地址 :Demo及SDK下載
整合文件: iOS接入指南
業務流程:官方流程文件
怎麼整合看官方文件就可以了,本文重點在二次封裝上
二次封裝
相比支付寶sdk,微信支付使用起來更簡單些,要了解微信的支付業務流程,可參考上面的文件。
微信支付需要服務端根據訂單資訊,返回一個預支付資料PrepayData,客戶端拿到這個預支付資料後,呼叫微信支付sdk完成支付。封裝後的程式碼如下:
建立一個微信支付的服務類WXPayService
// Created by reyzhang on 2017/4/10.
// Copyright © 2017年 hhkx All rights reserved.
// 微信支付服務封裝
#import <Foundation/Foundation.h>
#import "WXApi.h"
@interface WXPayService : NSObject <WXApiDelegate>
///單例來接收微信請求的回撥
+ (instancetype)sharedInstance;
// -- 根據介面返回的預支付資訊,構造支付請求
+ (PayReq *)getPayRequest:(NSDictionary *)prepayData;
///處理非支付請求的回撥
- (void)onRespCallBack:(void(^)(BaseResp * resp))callback;
///從伺服器端獲取到微信返回的支付請求用到的引數來發起支付請求
- (void)startPayWithReq:(PayReq *)req callback:(void(^)(BaseResp * resp))callback;
@end
實現程式碼 .m
// Created by reyzhang on 2017/4/10.
// Copyright © 2017年 hhkx All rights reserved.
// 微信支付服務封裝
#import "WXPayService.h"
@interface WXPayService ()
@property (nonatomic,copy) void(^RespCallBack)(BaseResp *);
@end
static WXPayService *sharedInstance;
@implementation WXPayService
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [super allocWithZone:zone];
});
return sharedInstance;
}
///單例來接收微信請求的回撥
+ (instancetype)sharedInstance {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
// -- 根據介面返回的預支付資訊,構造支付請求
+ (PayReq *)getPayRequest:(NSDictionary *)prepayData {
if (prepayData) {
PayReq *req = [[PayReq alloc] init];
req.partnerId = [prepayData stringForKey:@"partnerid"]; // -- 商家id
req.prepayId = [prepayData stringForKey:@"prepayid"];
req.nonceStr = [prepayData stringForKey:@"noncestr"];
req.timeStamp = [[prepayData stringForKey:@"timestamp"] intValue];
req.package = [prepayData stringForKey:@"package"];
req.sign = [prepayData stringForKey:@"sign"];
//日誌輸出
NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",[prepayData stringForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign);
return req;
}
return nil;
}
///處理非支付請求的回撥
- (void)onRespCallBack:(void(^)(BaseResp * resp))callback {
self.RespCallBack = callback;
}
///從伺服器端獲取到微信返回的支付請求用到的引數來發起支付請求
- (void)startPayWithReq:(PayReq *)req callback:(void(^)(BaseResp * resp))callback {
NSAssert(req !=nil , @"未成功建立微信支付請求");
self.RespCallBack = callback;
if ([WXApi isWXAppInstalled]) { // -- 判斷是否安裝微信應用
//發起微信支付,設定引數
[WXApi sendReq:req];
}else {
self.RespCallBack(nil);
}
}
#pragma mark WXApiDelegate
- (void)onResp:(BaseResp *)resp {
if ([resp isKindOfClass:[PayResp class]]) { // -- 判斷是否為支付的回撥
self.RespCallBack(resp);
}
}
@end
呼叫
在應用啟動時還是先配置微信支付的AppKey
- (void)setupWXPay {
[WXApi registerApp:@"your appkey" withDescription:@"description"];
}
使用
- (void)WXPay {
// -- first check 微信是否安裝
if (![WXApi isWXAppInstalled]) {
NSLog(@"微信應用未安裝");
return;
}
// -- second 呼叫伺服器介面獲取預支付資料
[_service getPrepayData:^(id prepayData) {
// -- 構造支付請求PayReq
PayReq *req = [WXPayService getPayRequest:prepayData];
// -- 調起微信支付sdk
[[WXPayService sharedInstance] startPayWithReq:req callback:^(BaseResp *resp) {
if (!resp) {
return ;
}
if (resp.errCode == WXSuccess) {
NSLog(@"支付成功");
}else {
NSLog(@"支付失敗");
}
}];
}];
}
在AppDelegate中的回撥處理
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
[self handleOpenURL:url];
return YES;
}
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
[self handleOpenURL:url];
return YES;
}
- (void)handleOpenURL:(NSURL*)url {
if ([url.host isEqualToString:@"pay"]) { // -- 微信支付
[WXApi handleOpenURL:url delegate:[WXPayService sharedInstance]];
}
}
寫在最後:
如果我的文章對你有所幫助,請幫忙點個贊?,謝謝!
相關文章
- iOS微信支付接入以及工具類封裝iOS封裝
- 微信支付封裝成npm 包封裝NPM
- axios二次封裝iOS封裝
- axios的二次封裝iOS封裝
- iOS微信支付整合 SDK1 7 5iOS
- axios二次封裝學習iOS封裝
- 對iOS端支付寶和微信支付程式碼進行整合iOS
- axios的二次封裝與async,await的配合使用?iOS封裝AI
- Android整合微信支付Android
- FMDB 二次封裝工具類,讓你快速學會封裝,整合資料庫封裝資料庫
- vue介面請求方式axios二次封裝VueiOS封裝
- Vue二次封裝axios為外掛使用Vue封裝iOS
- iOS 微信支付SDK與微信友盟分享兩者同時整合時,出現的問題與解決之路。iOS
- 整合支付寶錢包支付 iOS SDK 的方法與經驗iOS
- vue全家桶 ---axios的使用和二次封裝VueiOS封裝
- android volley解析與二次封裝Android封裝
- iOS使用Stripe整合支付寶Alipay支付iOS
- Flutter Dio二次封裝Flutter封裝
- 二次封裝WebDriverWait封裝WebAI
- iOS 微信支付(服務端下單)iOS服務端
- iOS 微信支付(客戶端下單)iOS客戶端
- android 整合微信支付和支付寶支付其實很簡單Android
- vue中axios的使用與封裝VueiOS封裝
- elment dialog二次封裝封裝
- OpenResty Redis操作二次封裝RESTRedis封裝
- FMDB 二次封裝,面向模型封裝模型
- axios封裝iOS封裝
- 封裝axios封裝iOS
- thinkphp整合系列之微信公眾號支付PHP
- C#開發微信門戶及應用(35)--微信支付之企業付款封裝操作C#封裝
- iOS開發之微信聊天工具欄的封裝iOS封裝
- pay-spring-boot 開箱即用的Java支付模組,整合支付寶支付、微信支付SpringbootJava
- Android 支付寶支付功能封裝實現Android封裝
- iOS--支付寶環境整合iOS
- Dapper的封裝、二次封裝、官方擴充套件包封裝,以及ADO.NET原生封裝APP封裝套件
- 二次封裝 query ajax 辦法封裝
- uview-ui toast 二次封裝ViewUIAST封裝
- 微信小程式元件封裝微信小程式元件封裝