iOS 開發之支付

iOS 開發支付篇

隨著互聯網的發展,電商平臺已經成為人們的習慣一種生活方式,電商個人認為站在開發的角度看,也就多了一個購物車和支付,而支付稱為很多剛接觸電商平臺開發人員很向往的一個技術點,那么現在我講自己了解的當前所有支付方式以及如何使用分享給大家。

支付寶支付:

支付流程 :

(1)先與支付寶簽約,獲取商戶id(partner)和賬號id(seller)

(2)下載相應的公私鑰文件(加密簽名使用),在客戶端我們可能只需要私鑰

(3)下載支付寶sdk

(4)生成訂單信息,可以直接客戶端或者自己服務端生存都可以,但是大多是服務端生存的。

(5)調用支付寶客戶端,有支付寶客戶端跟支付寶打交道

(6)支付完畢之后返回結果給客戶端和服務端。


//回到本應用urlScheme

NSString *appScheme=@"Practice";

NSString * orderInfo=[self getOrderInfo:indexPath.row];

NSString * signedStr=[self doRsa:orderInfo];

NSString*orderString=[NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",orderInfo,signedStr,@"RSA"];

[AlixLibService payOrder:orderString AndScheme:appScheme seletor:_result target:self];

-(NSString *)doRsa:(NSString *)orderInfo

{

idsigner;

signer=CreateRSADataSigner(PartnerPrivKey);

NSString * signedString=[signer signString:orderInfo];

return signedString;

}

-(NSString *)getOrderInfo:(NSInteger)index

{

//點擊獲取product實例,并初始化訂單信息

Pruduct *pruduct=[_dataArray objectAtIndex:index];

AlixPayOrder * order=[[AlixPayOrder alloc]init];

order.partner=PartnerID;

order.seller=SellerID;

//訂單ID

order.tradeNO=[self generateTradeNO];

// 商品標題

order.productName=pruduct.subject;

// 商品描述

order.productDescription =pruduct.body;

//商品價格

order.amount=[NSString stringWithFormat:@"%.2f",pruduct.price];

order.notifyURL = @"http%3A%2F%2Fwwww.xxx.com"; //回調URL

return order.description;

}

-(NSString *)generateTradeNO

{

const int N =15;

NSString * sourceString=@"SSSSSSSSSSSSSSSS";

NSMutableString *re=[[NSMutableString alloc]init];

srand(time(0));

for (int i=0; i unsigned index=rand()%[sourceString length];

NSString * s=[sourceString substringWithRange:NSMakeRange(index, 1)];

[re appendString:s];

}

return re;

}

-(void)paymentResultDelegate:(NSString *)result

{

NSLog(@"%@",result);

}

//支付寶也就這么幾行代碼而已,所謂的高大上是不是讓朋友們失望了


微信支付:

支付流程:

(1)注冊微信開放平臺,創建應用獲取appid,appSecret,申請支付功能,申請成功之后會返回一些參數詳情見圖

(2)下載微信支付sdk

(3)客戶端請求訂單,后臺與微信后臺交互,返回給客戶端支付參數;

(4)調用微信客戶端,由微信客戶端和微信服務器打交道;

(5)客戶端和服務端都會收到支付結果;(前臺消息不可靠,我們需要去后臺驗證,如果后臺沒有收到支付通知,后臺去微信服務器驗證然后將結果返回給客戶端)



//需要的依賴庫,環境搭建可以參見文檔,或者直接用cocoapods倒入

/**

*? 微信開放平臺申請得到的 appid, 需要同時添加在 URL schema

*/

NSString * const WXAppId = @"wxd930ea5d5a258f4f";

/**

* 微信開放平臺和商戶約定的支付密鑰

*

* 注意:不能hardcode在客戶端,建議genSign這個過程由服務器端完成

*/

NSString * const WXAppKey = @"L8LrMqqeGRxST5reouB0K66CaYAWpqhAVsq7ggKkxHCOastWksvuX1uvmvQclxaHoYd3ElNBrNO2DHnnzgfVG9Qs473M3DTOZug5er46FhuGofumV8H2FVR9qkjSlC5K";

/**

* 微信開放平臺和商戶約定的密鑰

*

* 注意:不能hardcode在客戶端,建議genSign這個過程由服務器端完成

*/

NSString * const WXAppSecret = @"db426a9829e4b49a0dcac7b4162da6b6";

/**

* 微信開放平臺和商戶約定的支付密鑰

*

* 注意:不能hardcode在客戶端,建議genSign這個過程由服務器端完成

*/

NSString * const WXPartnerKey = @"8934e7d15453e97507ef794cf7b0519d";

/**

*? 微信公眾平臺商戶模塊生成的ID

*/

NSString * const WXPartnerId = @"1900000109";

調用支付的代碼就比較簡單了,如下所示

#pragma mark - 主體流程

- (void)getAccessToken

{

NSString *getAccessTokenUrl = [NSString stringWithFormat:@"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%@&secret=%@", WXAppId, WXAppSecret];

NSLog(@"--- GetAccessTokenUrl: %@", getAccessTokenUrl);

self.request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:getAccessTokenUrl]];

__weak WXPayClient *weakSelf = self;

__weak ASIHTTPRequest *weakRequest = self.request;

[self.request setCompletionBlock:^{

NSError *error = nil;

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:[weakRequest responseData]

options:kNilOptions

error:&error];


if (error) {

[weakSelf showAlertWithTitle:@"錯誤" msg:@"獲取 AccessToken 失敗"];

return;

} else {

NSLog(@"--- %@", [weakRequest responseString]);

}

NSString *accessToken = dict[AccessTokenKey];

if (accessToken) {

NSLog(@"--- AccessToken: %@", accessToken);

__strong WXPayClient *strongSelf = weakSelf;

[strongSelf getPrepayId:accessToken];

} else {

NSString *strMsg = [NSString stringWithFormat:@"errcode: %@, errmsg:%@", dict[errcodeKey], dict[errmsgKey]];

[weakSelf showAlertWithTitle:@"錯誤" msg:strMsg];

}

}];

[self.request setFailedBlock:^{

[weakSelf showAlertWithTitle:@"錯誤" msg:@"獲取 AccessToken 失敗"];

}];

[self.request startAsynchronous];

}

- (void)getPrepayId:(NSString *)accessToken

{

//token傳入到此鏈接

NSString *getPrepayIdUrl = [NSString stringWithFormat:@"https://api.weixin.qq.com/pay/genprepay?access_token=%@", accessToken];

NSLog(@"--- GetPrepayIdUrl: %@", getPrepayIdUrl);

NSMutableData *postData = [self getProductArgs];

// 文檔: 詳細的訂單數據放在 PostData 中,格式為 json

self.request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:getPrepayIdUrl]];

[self.request addRequestHeader:@"Content-Type" value:@"application/json"];

[self.request addRequestHeader:@"Accept" value:@"application/json"];

[self.request setRequestMethod:@"POST"];

[self.request setPostBody:postData];

__weak WXPayClient *weakSelf = self;

__weak ASIHTTPRequest *weakRequest = self.request;

[self.request setCompletionBlock:^{

NSError *error = nil;

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:[weakRequest responseData]

options:kNilOptions

error:&error];

//獲取到了支付參數

if (error) {

[weakSelf showAlertWithTitle:@"錯誤" msg:@"獲取 PrePayId 失敗"];

return;

} else {

NSLog(@"--- %@", [weakRequest responseString]);

}

NSString *prePayId = dict[PrePayIdKey];

if (prePayId) {

NSLog(@"--- PrePayId: %@", prePayId);

// 調起微信支付

//將支付參數傳入到sdk,喚起微信客戶端

PayReq *request? = [[PayReq alloc] init];

request.partnerId = WXPartnerId;

request.prepayId? = prePayId;

request.package? = @"Sign=WXPay";? ? ? // 文檔為 `Request.package = _package;` , 但如果填寫上面生成的 `package` 將不能支付成功

request.nonceStr? = weakSelf.nonceStr;

request.timeStamp = [weakSelf.timeStamp longLongValue];

// 構造參數列表

NSMutableDictionary *params = [NSMutableDictionary dictionary];

[params setObject:WXAppId forKey:@"appid"];

[params setObject:WXAppKey forKey:@"appkey"];

[params setObject:request.nonceStr forKey:@"noncestr"];

[params setObject:request.package forKey:@"package"];

[params setObject:request.partnerId forKey:@"partnerid"];

[params setObject:request.prepayId forKey:@"prepayid"];

[params setObject:weakSelf.timeStamp forKey:@"timestamp"];

request.sign = [weakSelf genSign:params];

// 在支付之前,如果應用沒有注冊到微信,應該先調用 [WXApi registerApp:appId] 將應用注冊到微信

[WXApi safeSendReq:request];

} else {

NSString *strMsg = [NSString stringWithFormat:@"errcode: %@, errmsg:%@", dict[errcodeKey], dict[errmsgKey]];

[weakSelf showAlertWithTitle:@"錯誤" msg:strMsg];

}

}];

[self.request setFailedBlock:^{

[weakSelf showAlertWithTitle:@"錯誤" msg:@"獲取 PrePayId 失敗"];

}];

[self.request startAsynchronous];

}

//這是微信官方給的demo,直接調用getAccessToken方法即可完成支付



銀聯支付:

支付流程:

(1)注冊申請就不是前端的事了,直接介入sdk

(2)從自己的服務端獲取流水號

(3)然后調用銀聯sdk,不用跳轉,銀聯sdk直接是內嵌的

(4)支付完成之后會回調代理方法


銀聯支付在客戶端實現起來最簡單的,現在介紹一下客戶端如何實現 ,以及實現代碼

- (void)viewDidLoad {

[super viewDidLoad];

//開始支付

//第一個參數是流水號,又后臺返回給我們 第二個參數傳00,01,00標示正式環境,01標示測試環境,第三個參數是支付完成回到的控制器,第四個參數是設置代理

[UPPayPlugin startPay:@"57855654" mode:@"01" viewController:self.navigationController delegate:self];

// Do any additional setup after loading the view, typically from a nib.

}

//監聽支付結果

- (void)UPPayPluginResult:(NSString *)result

{

}

//銀聯支付將復雜操作全部放在了后臺,我們使用相當方便



當然下面才是最常用的,它集成所有支付功能于一身:Ping++

支付流程:

4,ping++,支持支付寶支付,微信支付,銀聯支付,百度錢包支付,applepay

(1)根據呢需要介入的支付方式去對應的支付平臺申請賬號和參數

(2)(恨不得直接上代碼了),傳說中的7行代碼搞定支付


Ping++有著前所未有的簡單,號稱7行代碼搞定支付

NSDictionary* dict = @{? ? @"channel" : channel, // 渠道 alipay, wx, upacp, bfb

@"amount"? : amount? // 金額};

NSData* data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];

NSString *bodyData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

[postRequest setHTTPBody:[NSData dataWithBytes:[bodyData UTF8String] length:strlen([bodyData UTF8String])]];

[postRequest setHTTPMethod:@"POST"];

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[NSURLConnection sendAsynchronousRequest:postRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;

NSString* charge = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];? ? // ...

[Pingpp createPayment:charge viewController:viewController appURLScheme:kUrlScheme withCompletion:^(NSString *result, PingppError *error) {? ?

?if ([result isEqualToString:@"success"]) {? ? ? ? // ...

} else {? ? ??

? NSLog(@"PingppError: code=%lu msg=%@", error.code, [error getMsg]);

}

}];

}];

//AppDelegate添加這行代碼適用于監聽支付結果的

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {

[Pingpp handleOpenURL:url withCompletion:^(NSString *result, PingppError *error) {? ? ? ? if ([result isEqualToString:@"success"]) {? ? ? ? ? ? // ...

} else {? ? ? ? ? ? NSLog(@"PingppError: code=%lu msg=%@", error.code, [error getMsg]);

}

}];? ? return? YES;

}

綜上所述,你可以跟你的個人需求來選擇接入支付方式

第三方支付,終究還是第三方,第三方站著公司和開發者的角度上考慮問題,減少開發難度和成本,不必要如此擔心。

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

推薦閱讀更多精彩內容

  • 項目中要用到支付功能,需要支付寶,微信,銀聯三大支付,所以打算總結一下,寫兩篇文章,方便以后的查閱, 大家在做的時...
    Ke_Wang閱讀 24,138評論 17 121
  • 筆者最近的項目中使用到了支付的功能,也遇到了一些坑。在這里跟大家分享一下。 相關配置 1.向支付寶申請, 與支付寶...
    YanniLiu閱讀 623評論 0 3
  • iOS支付 iOS支付分為兩類,第三方支付和應用內支付(內購)。 第三方支付包括:支付寶支付、微信支付、銀聯支付、...
    請輸入賬號名閱讀 6,243評論 3 22
  • 周澤楷盯著腳尖看,白色的鞋尖沾上了一點泥。 “時間快到了。”江波濤拍了拍他的肩膀,他起身把手槍裝進槍匣里,回頭看了...
    紀堂_閱讀 560評論 0 0
  • 地圖+爬蟲https://zhuanlan.zhihu.com/p/21883516 顏色 線條 k w r y ...
    maocy閱讀 645評論 0 0