首頁  >  文章  >  微信小程式  >  詳解iOS微信支付開發案例代碼

詳解iOS微信支付開發案例代碼

高洛峰
高洛峰原創
2017-03-27 13:30:342288瀏覽

這篇文章主要為大家詳細介紹了iOS微信支付開發案例,具有一定的參考價值,有興趣的小伙伴們可以參考一下

微信支付有很多坑的,官方提供的文檔一點都不全面,而且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

可複製貼上的程式碼(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 加密


#

以上是詳解iOS微信支付開發案例代碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn