最近公司做了個(gè)項(xiàng)目 投放市場(chǎng)在澳門庄萎,澳門那邊的支付環(huán)境主要使用澳門通(以下使用MPay代替)迹恐,所以在做支付功能的時(shí)候挣惰,就有了MPay集成需求。初聽到這個(gè)消息的時(shí)候殴边,作為一名工作積極份子憎茂,立馬開始了一頓猛如虎的操作——百度、谷歌锤岸、簡(jiǎn)書竖幔、GitHub等各大平臺(tái)各種搜索,結(jié)果無奈的發(fā)現(xiàn)是偷,均沒有關(guān)于iOS MPay集成這方面的資料拳氢,可能是因?yàn)楸容^小眾的緣故,咱忍了蛋铆。
因?yàn)樵诎拈T通集成過程中幾經(jīng)波折,也碰到過些坑市咆,在完成之后汉操,回頭發(fā)現(xiàn)本來很簡(jiǎn)單的事情,因?yàn)椴皇煜っ衫迹约霸谂c澳方溝通過程花費(fèi)了大量時(shí)間磷瘤,所以將自己的血淚歷程與MPay集成方法,以及碰到的坑搜变,分享給大家采缚,希望大家在開發(fā)過程中能節(jié)省點(diǎn)寶貴的時(shí)間及少趟點(diǎn)坑,權(quán)當(dāng)拋磚引玉挠他。
MPay 在打包靜態(tài)庫的時(shí)候殖侵,已經(jīng)將 微信 打包進(jìn)了SDK贸呢,所以如果項(xiàng)目在調(diào)用 微信 的時(shí)候,只能使用 MPay內(nèi)部集成的 微信 支付拢军,如果外界想要單獨(dú)調(diào)用 微信支付的時(shí)候楞陷,在導(dǎo)入 微信 SDK的時(shí)候,就會(huì)報(bào) 重復(fù)導(dǎo)入 的錯(cuò)誤茉唉。這是一個(gè)坑固蛾,要留意一下!
所以度陆,以下分為三個(gè)步驟來說明 MPAy 支付艾凯,MPay調(diào)用 支付寶 ,MPay調(diào)用微信 懂傀。
澳門通與商戶之間通過交換報(bào)文與資料檔案來交換業(yè)務(wù)資訊览芳、實(shí)現(xiàn)業(yè)務(wù)流程、控制業(yè)務(wù)規(guī)則鸿竖。雙方的交互模式可以歸納為請(qǐng)求-應(yīng)答沧竟、單向通知、文檔上傳與文檔下載這四種模式缚忧,實(shí)際業(yè)務(wù)中可能會(huì)將各種交互模式結(jié)合起來使用悟泵。下文將介紹這四種交互模式適用的場(chǎng)景與實(shí)現(xiàn)方式。
1闪水、請(qǐng)求(Request)-應(yīng)答(Response)模式:
在請(qǐng)求-應(yīng)答模式下糕非,一方作為服務(wù)提供者,另一方作為服務(wù)使用者。由服 務(wù)使用者主動(dòng)向服務(wù)提供者發(fā)起請(qǐng)求并等待應(yīng)答朽肥,服務(wù)提供者接受請(qǐng)求禁筏,完成 處理,并向服務(wù)使用者應(yīng)答處理結(jié)果衡招,服務(wù)使用者收到處理結(jié)果之后進(jìn)行后續(xù) 處理篱昔。
請(qǐng)求-應(yīng)答模式適用于服務(wù)使用者需要根據(jù)服務(wù)提供者的服務(wù)應(yīng)答才能進(jìn)行 正確的后續(xù)處理的場(chǎng)景。 本文中始腾,服務(wù)使用者指商戶的系統(tǒng)設(shè)施及服務(wù)州刽,服務(wù)提供者指澳門通及其相應(yīng) 的系統(tǒng)設(shè)施及服務(wù)。
2浪箭、單向通知模式:
在單向通知模式下穗椅,一方作為通知發(fā)送者,一方作為通知接收者奶栖。發(fā)送者發(fā)送通知匹表,并保證接收者收到通知。通知接收者在收到通知之后宣鄙,立即返回發(fā)送者通知已收到袍镀。通知送達(dá)之后,發(fā)送方與接收方可以獨(dú)立地進(jìn)行后續(xù)業(yè)務(wù)處理框冀。如果對(duì)方進(jìn)行業(yè)務(wù)處理所需的時(shí)間不可預(yù)知時(shí),采用單向通知模式敏簿。單向通知模式可以單獨(dú)使用明也,也可以作為其它交互模式的一部分使用,因此惯裕,單向模式適用于澳門通主動(dòng)通知商戶交易處理成功温数。
一:MPaySDK支付集成流程
1:由MPay iOS端提供的 MPaySDK.framework靜態(tài)庫引入到工程項(xiàng)目中(目前不支持Cocopods);
在需要支付的類中導(dǎo)入 #import <MPaySDK/MPaySDK.h> 文件路徑
2:Command+B 編譯一下蜻势,報(bào)錯(cuò)導(dǎo)入以下類:
libsqlite3.tbd
libc++.tbd
libz.tbd
libc.tbd
CoreMotion.framework
CFNetwork.framework
SystemConfiguration.framework
CoreTelephony.framework
QuartzCore.framework
CoreText.framework
CoreGraphics.framework
Foundation.framework
UIKit.framework
編譯撑刺,完美通過
3:Target - info -URL Types 配置URL Types 設(shè)置自己項(xiàng)目的URL Schems,以便調(diào)用SDK方法的時(shí)候使用
因?yàn)閁AT測(cè)試環(huán)境,生產(chǎn)環(huán)境服務(wù)器的https應(yīng)用層不
支持ATS設(shè)置握玛,如果應(yīng)用程式基于9.0編譯够傍,由于iOS9.0中https應(yīng)用程序傳輸安全(ATS)的限制,我們需要設(shè)置:NSAppTransportSecurity 的 Allow Arbitrary Loads 為 YES
4挠铲、支付環(huán)境設(shè)置
在MPaySDK.h文件中可以查看環(huán)境變量的枚舉值
0:MPay_SIT 代表MPay SIT 環(huán)境
1: MPay_UAT 代表MPay UAT環(huán)境
2:MPay_Prod 代表MPay 生產(chǎn)環(huán)境
通過實(shí)例方法進(jìn)行UAT環(huán)境配置
例:[[MPaySDKsharedInstance] setEnvironmentType:MPay_UAT];
5冕屯、支付方法調(diào)用
/**
商戶使用(MPay)
@param params 商戶簽名后的訂單數(shù)據(jù)
@param schema 商戶APP的url schema
@param sender 當(dāng)前控制器
@param delegate 實(shí)現(xiàn)協(xié)議方法的代理對(duì)象
*/
-(void)MPayWithParams:(NSDictionary *)params withSchema:(NSString *)schema WithSender:(id)sender withDelegate:(id<MPaySDKDelegate>)delegate;
6、params 參數(shù)說明
參數(shù) | 類型 | 是否必填 | 最大長(zhǎng)度 | 描述 | 示例值 |
---|---|---|---|---|---|
app_id | String | 必須 | 32 | MacauPay分配給開發(fā)者的應(yīng)用ID | 2014072300007148 |
api_name | String | 必須 | 30 | 接口名稱 | preCreate |
biz_api_code | String | 必須 | 30 | 接口功能 | 100020007 |
data_type | String | 可選 | 40 | 僅支持JSON | JSON |
charset | String | 必須 | 10 | 請(qǐng)求使用的編碼格式拂苹,如utf-8,gbk,gb2312等 | utf-8 |
sign_type | String | 必須 | 10 | 商戶生成簽名字符串所使用的簽名算法類型安聘,目前支持RSA | RSA |
sign | String | 必須 | 256 | 商戶請(qǐng)求參數(shù)的簽名串,詳見簽名 | 詳見示例,6.4.私鑰生成請(qǐng)求簽名章節(jié) |
timestamp | String | 必須 | 19 | 發(fā)送請(qǐng)求的時(shí)間,格式"yyyy-MM-dd HH:mm:ss" | 2014-07-24 03:07:50 |
version | String | 必須 | 3 | 調(diào)用的接口版本浴韭,固定為:1.0 | 1.0 |
biz_content | String | 必須 | - | 請(qǐng)求參數(shù)的集合丘喻,最大長(zhǎng)度不限,除公共參數(shù)外所有請(qǐng)求參數(shù)都必須放在這個(gè)參數(shù)中傳遞念颈,具體參照各產(chǎn)品快速接入文檔 | 參考下面 |
● biz_content 說明
參數(shù) | 類型 | 是否必填 | 最大長(zhǎng)度 | 描述 | 示例值 |
---|---|---|---|---|---|
out_trade_no | String | 必須 | 64 | 商戶訂單號(hào),64個(gè)字符以內(nèi)泉粉、只能包含字母、數(shù)字舍肠、下劃線搀继;需保證在商戶端不重復(fù) | 20150320010101001 |
total_amount | Price | 必須 | 9 | 訂單總金額,單位為元翠语,精確到小數(shù)點(diǎn)后兩位叽躯,取值范圍[0.01,100000000] | 88.88 |
subject | String | 必須 | 256 | 訂單標(biāo)題 | Iphone6 16G |
trade_mode | String | 必須 | 10 | 0001擔(dān)保支付,0002即時(shí)到賬肌括,默認(rèn):0002 | 0002即時(shí)到賬 |
body | String | 可選 | 128 | 對(duì)交易或商品的描述 | Iphone6 16G |
buyer_logon_id | String | 可選 | 100 | 買家MacauPay賬號(hào)点骑,和 buyer_user_id不能同時(shí)為空 | 15901825620 |
buyer_user_id | String | 可選 | 28 | 買家在MacauPay的用戶id | 2088101117955611 |
operator_id | String | 可選 | 28 | 商戶操作員編號(hào) | Yx_001 |
store_id | String | 可選 | 32 | 商戶門店編號(hào) | NJ_001 |
terminal_id | String | 可選 | 32 | 商戶機(jī)具終端編號(hào) | NJ_T_001 |
timeout_express | String | 可選 | 6 | 該筆訂單允許的最晚付款時(shí)間,逾期將關(guān)閉交易谍夭。取值范圍:1m~15d黑滴。m-分鐘,h-小時(shí)紧索,d-天袁辈,1c-當(dāng)天(1c-當(dāng)天的情況下,無論交易何時(shí)創(chuàng)建珠漂,都在0點(diǎn)關(guān)閉)晚缩。該參數(shù)數(shù)值不接受小數(shù)點(diǎn),如 1.5h媳危,可轉(zhuǎn)換為 90m荞彼。默認(rèn)90m | 90m |
submerchant_id | String | 可選 | 32 | 二級(jí)商戶號(hào),與MacauPay約定按照MCC收手續(xù)費(fèi)時(shí)使用 | 2016041400077000000003314986 |
currency | String | 可選 | 6 | 默認(rèn)MOP | MOP |
notify_url | String | 可選 | 256 | MacauPay服務(wù)器主動(dòng)異步通知商戶服務(wù)器里指定的頁面http/https路徑待笑。 | http://api.test.net/atinterface/receive_n |
return_url | String | 可選 | 256 | MacauPay服務(wù)器主動(dòng)同步通知商戶服務(wù)器里指定的頁面http/https路徑鸣皂。 | http://api.test.net/atinterface/receive_n |
goods_detail | GoodsDetail [] | 可選 | - | 訂單包含的商品列表信息.Json格式. 其它說明詳見:“商品明細(xì)說明” | [{"order_no":"201604141231231231231222","goods_id":"apple-01","goods_name":"ipad","goods_category":"7788230","price":"2000.00","quantity":"1"}] |
order_no | String | 必填 | 64 | 商品明細(xì)訂單號(hào) | 2016041400077000000003 |
goods_id | String | 必填 | 32 | 商品的編號(hào) | apple-01 |
goods_name | String | 必填 | 256 | 商品名稱 | ipad |
quantity | Number | 必填 | 10 | 商品數(shù)量 | 1 |
price | Price | 必填 | 9 | 商品單價(jià),單位為元 | 2000 |
body | String | 可選 | 1000 | 商品描述信息 | 特價(jià)手機(jī) |
show_url | String | 可選 | 400 | 商品的圖片地址 | http://www.alipay.com/xxx.jpg |
7暮蹂、方法具體實(shí)現(xiàn):
//簽名地址 - 要改成貴公司服務(wù)器 api 地址
NSString*signUrl = @"xxxx";
//簽完名之后拿到服務(wù)器返回的NSDictionary類型數(shù)據(jù)寞缝,作為參數(shù)
//調(diào)起支付
if(params) {
[[MPaySDK sharedInstance]MPayWithParams:params withSchema:@"macaupayF2823" WithSender:self withDelegate:self];
}
8、在響應(yīng)事件 控制器中遵循代理協(xié)議
@interface ViewController ()<MPaySDKDelegate>
實(shí)現(xiàn)代理方法
//實(shí)現(xiàn)支付完成或者取消之后的回調(diào)結(jié)果(注意兼容ios8的方法)
//在需要處理結(jié)果的地方實(shí)現(xiàn)MPaySDKDelegate協(xié)議方法 處理展示結(jié)果邏輯
/**
支付成功回調(diào)
@paramstatus 支付狀態(tài)標(biāo)誌 true成功 false 失敗
@paramorder 訂單信息
*/
-(void)MPaySDK_WithPayStatus:(bool)status WithOrder:(NSDictionary*)order;
/**
支付失敗回調(diào)
@paramerrorInfo 錯(cuò)誤信息
@paramerrorCode 錯(cuò)誤碼
*/
-(void)MPaySDK_WithFailed:(NSString*)errorInfo withErrorCode:(NSString*)errorCode;
9仰泻、支付回調(diào)及響應(yīng)狀態(tài)
在項(xiàng)目AppDelegate.m里面的回調(diào)方法
-(BOOL)application:(UIApplication*)app openURL:(NSURL*)url options:(NSDictionary *)options{
//里面調(diào)用
[[MPaySDK sharedInstance]ProcessOrderWithPaymentResult:url];
return true;
}
-(BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation
{
//回調(diào)方法第租,必調(diào)
[[MPaySDK sharedInstance] ProcessOrderWithPaymentResult:url];
return true;
}
10、支付狀態(tài)碼
Code | ResultMsg |
---|---|
9000 | 訂單支付成功 |
6002 | 網(wǎng)絡(luò)連接出錯(cuò) |
6001 | 用戶中途取消 |
5000 | 支付異常 |
4044 | 訂單金額無效 |
4004 | 無效訂單 |
4000 | 訂單支付失敗 |
1000 | 簽名失敗 |
0001 | 手續(xù)費(fèi)大於交易金額 |
1002 | 數(shù)據(jù)格式錯(cuò)誤 |
二:AliPaySDK支付集成流程
AliPay 和 MPay 前期配置相同我纪,導(dǎo)入MPaySDK.framework靜態(tài)庫慎宾,并且需要導(dǎo)入AliPaySDK 包文件丐吓,只不過支付方法和 上傳參數(shù),這里只說明有區(qū)別的點(diǎn)趟据,其它參考 上面 MPay券犁,AliPaySDK支付狀態(tài)碼參考同MPaySDK支付狀態(tài)碼
1、支付方法調(diào)用
/**
商戶使用(支付寶)
@paramparams 商戶簽名后的訂單數(shù)據(jù)
@paramScheme 商戶APP的url schema
@paramdelegate 實(shí)現(xiàn)協(xié)議方法的代理對(duì)象
*/
-(void)AliPayWithParams:(NSDictionary*)params withScheme:(NSString*)Scheme with:(id)delegate;
2汹碱、params參數(shù)說明
參數(shù) | 類型 | 是否必填 | 最大長(zhǎng)度 | 描述 | 示例值 |
---|---|---|---|---|---|
app_id | String | 必須 | 32 | MacauPay分配給開發(fā)者的應(yīng)用ID | 2014072300007148 |
api_name | String | 必須 | 30 | 接口名稱 | aliNoAccPay |
biz_api_code | String | 必須 | 30 | 接口功能 | 100020008 |
data_type | String | 可選 | 40 | 僅支持JSON | JSON |
charset | String | 必須 | 10 | 請(qǐng)求使用的編碼格式粘衬,如utf-8,gbk,gb2312等 | utf-8 |
sign_type | String | 必須 | 10 | 商戶生成簽名字符串所使用的簽名算法類型,目前支持RSA | RSA |
sign | String | 必須 | 256 | 商戶請(qǐng)求參數(shù)的簽名串咳促,詳見簽名 | 詳見示例,6.4.私鑰生成請(qǐng)求簽名章節(jié) |
timestamp | String | 必須 | 19 | 發(fā)送請(qǐng)求的時(shí)間稚新,格式"yyyy-MM-dd HH:mm:ss" | 2014-07-24 03:07:50 |
version | String | 必須 | 3 | 調(diào)用的接口版本,固定為:1.0 | 1.0 |
biz_content | String | 必須 | - | 請(qǐng)求參數(shù)的集合跪腹,最大長(zhǎng)度不限褂删,除公共參數(shù)外所有請(qǐng)求參數(shù)都必須放在這個(gè)參數(shù)中傳遞,具體參照各產(chǎn)品快速接入文檔 | 參考下面 |
● biz_content 說明
參考macauPay的參數(shù)說明
3冲茸、方法具體實(shí)現(xiàn):
//a屯阀、簽名地址 - 要改成貴公司服務(wù)器 api 地址
NSString*signUrl = @"xxxx";
//b、簽完名之后拿到服務(wù)器返回的NSDictionary類型數(shù)據(jù)轴术,作為參數(shù)
//調(diào)起支付
if(params) {
[[MPaySDK sharedInstance] AliPayWithParams:params withScheme:@"macaupayF2823" with:self];
}
三:WechatPaySDK支付集成流程
由MPay iOS端提供的sdk文件难衰,MPaySDK.framework 靜態(tài)庫引用到工程項(xiàng)目中(如果已經(jīng)引入,無需重復(fù)引入):并且需要導(dǎo)入WechatPay支付所需要的文件和靜態(tài)庫:libWeChatSDK.a, WechatAuthSDK.h, WXApi.h, WXApiObject.當(dāng)已經(jīng)再開放平臺(tái)已經(jīng)注冊(cè)應(yīng)用并且報(bào)備之后逗栽,再項(xiàng)目工程里面的AppDelegate.h文件中導(dǎo)入的WXApi.h 盖袭,并且在didFinishLaunchingWithOptions 方法中向微信發(fā)起注冊(cè):
例:[WXApi registerApp:@"xxxx" enableMTA:NO];
在需要支付的類中導(dǎo)入MPaySDK.h文件路徑即可。
1彼宠、支付方法調(diào)用
/**
商戶使用(微信)
@paramparams 商戶簽名后的訂單數(shù)據(jù)
@paramScheme 商戶APP在開放平臺(tái)註冊(cè)的appid
@paramdelegate 實(shí)現(xiàn)協(xié)議方法的代理對(duì)象
*/
-(void)WeChatPayWithParams:(NSDictionary*)params withScheme:(NSString*)Scheme with:(id)delegate;
2鳄虱、params參數(shù)說明
參數(shù) | 類型 | 是否必填 | 最大長(zhǎng)度 | 描述 | 示例值 |
---|---|---|---|---|---|
appid | String | 必須 | 32 | 微信分配給開發(fā)者的應(yīng)用ID | wxb4ba3c02aa476ea1 |
partnerid | String | 必須 | 32 | 商戶號(hào) | 1900000109 |
package | String | 必須 | 128 | 擴(kuò)展字段 | Sign=WXPay |
noncestr | String | 可選 | 32 | 隨機(jī)字符串 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS |
timestamp | String | 必須 | 10 | 時(shí)間戳 | 1412000000 |
prepayid | String | 必須 | 32 | 預(yù)支付交易會(huì)話ID | 微信返回的支付交易會(huì)話ID |
sign | String | 必須 | 32 | 簽名 | C380BEC2BFD727A4B6845133519F3AD6 |
3、方法具體實(shí)現(xiàn):
//a兵志、簽名地址 - 要改成貴公司服務(wù)器 api 地址
NSString*signUrl = @"xxxx";
//b醇蝴、簽完名之后拿到服務(wù)器返回的NSDictionary類型數(shù)據(jù)宣肚,作為參數(shù)
//調(diào)起支付
if(params) {
[[MPaySDK sharedInstance] WeChatPayWithParams:params withScheme:@"macaupayF2823" with:self];
}
4想罕、支付回調(diào)及響應(yīng)狀態(tài)
參考同MPaySDK支付回調(diào)及響應(yīng)狀態(tài)
5、支付狀態(tài)碼
ResultStatus | Result |
---|---|
9000 | 訂單支付成功 |
6001 | 用戶中途取消 |
6005 | 微信支付:簽名錯(cuò)誤霉涨、未註冊(cè)APPID按价、項(xiàng)目設(shè)置APPID不正確、註冊(cè)的APPID與設(shè)置的不匹配笙瑟、其他異常等. |
以上就是 MPay iOS端集成的全部過程楼镐,如有疑問歡迎留言指正。??