国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS微信支付開發案例

2019-10-21 18:52:57
字體:
來源:轉載
供稿:網友

微信支付有很多坑的,官方提供的文檔一點都不全面,而且demo也比較”羞澀”難懂。很多注意的細節都沒有體現出來,走了很多彎路。于是,系統的開發流程如下。(完整的demo附在博客最后面)這里面包括微信支付開發和支付寶開發調用客戶端的兼容處理。(兩次簽名放在移動端,博客中沒提到沒安裝微信客戶端的情況,也很簡單[WXApi sendReq:request]調用這個方法的返回值為0即可判斷。)

一、環境配置

1、首先是https協議訪問,在plist設置白名單

ios,微信,支付

2、當你工程中有微信分享、收藏、支付、登錄等,需要在“Info.plist”里增加如下代碼(LSApplicationQueriesSchemes)

ios,微信,支付

3、解決bitcode編譯不過問題

ios,微信,支付

4、設置URL types

ios,微信,支付

5、導入SDK(可從微信官方的demo移植過來)

ios,微信,支付

6、導入系統依賴庫

ios,微信,支付

7、特別要注意的是

微信支付是以分為單位的,也就是說,如果你支付金額是保留兩位小數,支付的金額必須*100后再傳給微信支付平臺,其他的依次類推。

二、代碼開發

1、在程序入口(即applegate.m)需要進行的操作

ios,微信,支付

2、增加如下代理方法,否則不回調微信客服端(也是在delegate.m文件中)

ios,微信,支付

3、微信支付成功的回調函數

這個有必要說明下,官方文檔是這樣說明的:不能以客服端支付成功的結果就直接當做是訂單支付成功的結果,要以服務器返回的訂單狀態為準,也就是說,客服端支付成功后,微信支付平臺會給服務器發送支付成功的消息,后臺修改訂單狀態,重新返回給客戶端。簡單就是,支付成功要發送給特定的視圖控制器(帶有微信支付功能的視圖控制器)發送通知,讓這個特定的視圖控制去請求服務器訂單的住狀態。這個回調函數必須寫在delegate.m中!!!

ios,微信,支付

4、特定視圖控制器的代碼(帶有微信支付功能的視圖控制器)
4.1 提交預支付訂單獲得預訂單id(這個過程必須經過兩次簽名,分別是不帶參數簽名和攜帶參數簽名,當然,這些方法都已經在payRequsestHandler類封裝好了,你只需要傳參數調用方法就可以了)這個也是點擊支付按鈕的動作方法

ios,微信,支付

4.2得到預支付訂單,那么就可以調微信支付的客服端(4.2和4.1代碼是連續的)

ios,微信,支付

附帶sign參數簽名的獨立封裝的兩個方法,沒用payRequsestHandler封裝的方法,自己寫的,因為用了出現問題(問題截圖如下),先代碼截圖,后面再提供可直接復制黏貼的代碼塊
問題截圖:(相信很多人遇到過,100%是sign簽名的問題)

ios,微信,支付

方法一:

ios,微信,支付

方法二:

ios,微信,支付

4.3 上面的代碼就可以完全解決微信支付問題,剩下最后一個步驟,支付成功返回app調用delegate的-(void)onResp:(BaseResp*)resp方法,那么這里要發送通知給特定的視圖控制器,讓他去請求后臺的訂單狀態。這里要說明的是,你從那個界面調的微信支付后,返回還是在原處。只是回調方法必須在delegate中,所以必須在回調方法發送成功的通知。那么要在特定的視圖控制器的視圖即將出現的方法中,監聽到這個通知,然后請求后臺的訂單狀態。這里需要注意的是,需要重寫dealloc方法,移除通知。

ios,微信,支付

三、支付寶和微信支付的回調客戶端的代理方法的兼容處理

ios,微信,支付

四、demo分享地址

http://xiazai.vevb.com/201608/yuanma/IOSwxPay(vevb.com).rar

可供復制黏貼的代碼(sign簽名)

-(NSString )createMD5SingForPay:(NSString )appid_key partnerid:(NSString)partnerid_key prepayid:(NSString )prepayid_key package:(NSString )package_key noncestr:(NSString)noncestr_key timestamp:(UInt32)timestamp_key { NSMutableDictionary *signParams = [NSMutableDictionary dictionary]; [signParams setObject:appid_key forKey:@”appid”]; [signParams setObject:noncestr_key forKey:@”noncestr”]; [signParams setObject:package_key forKey:@”package”]; [signParams setObject:partnerid_key forKey:@”partnerid”]; [signParams setObject:prepayid_key forKey:@”prepayid”]; [signParams setObject:[NSString stringWithFormat:@”%u”,(unsigned int)timestamp_key] forKey:@”timestamp”];NSMutableString *contentString =[NSMutableString string]; NSArray *keys = [signParams allKeys]; //按字母順序排序 NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {return [obj1 compare:obj2 options:NSNumericSearch]; }]; //拼接字符串 for (NSString *categoryId in sortedArray) { if ( ![[signParams objectForKey:categoryId] isEqualToString:@”“] && ![[signParams objectForKey:categoryId] isEqualToString:@”sign”] && ![[signParams objectForKey:categoryId] isEqualToString:@”key”] ) { [contentString appendFormat:@”%@=%@&”, categoryId, [signParams objectForKey:categoryId]];} } //添加商戶密鑰key字段 [contentString appendFormat:@”key=%@”, @”這里填寫商戶密鑰”]; NSString *result = [self md5:contentString]; return result;}//創建發起支付時的sige簽名-(NSString ) md5:(NSString )str { const char *cStr = [str UTF8String]; unsigned char result[16]= “0123456789abcdef”; CC_MD5(cStr, (CC_LONG)strlen(cStr), result); //這里的x是小寫則產生的md5也是小寫,x是大寫則md5是大寫,這里只能用大寫,微信的大小寫驗證很逗 return [NSString stringWithFormat: @”%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X”, result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7], result[8], result[9], result[10], result[11], result[12], result[13], result[14], result[15] ]; }//MD5 加密

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汝城县| 灌阳县| 吉安县| 民和| 珲春市| 军事| 饶阳县| 印江| 龙胜| 泉州市| 广汉市| 喀什市| 融水| 洞口县| 庆云县| 蚌埠市| 竹溪县| 新民市| 韶关市| 桐城市| 德昌县| 龙泉市| 左权县| 隆化县| 鹤峰县| 介休市| 常熟市| 石狮市| 伊春市| 乐昌市| 阳江市| 崇州市| 秀山| 昔阳县| 大竹县| 西峡县| 方城县| 日照市| 赤水市| 平遥县| 台湾省|