說明
連連蘋果支付Demo下載地址
https://apple.lianlianpay.com/OpenPlatform/sdk_download.jsp
連連蘋果支付官方API說明(消費/預授權)
https://apple.lianlianpay.com/OpenPlatform/api_reference.jsp
Apple Pay在連連支付支持的 消費和預授權模式有什么區(qū)別?
預授權: 指特約商戶向發(fā)卡機構取得持卡人30天內(nèi)在不超過預授權金額一定比例范圍的付款承諾,并在持卡人獲取商品或接受服務后向發(fā)卡機構進行承兌的業(yè)務。通俗講就是先凍結(jié)銀行卡內(nèi)部分資金用作押金,后按實際消費金額結(jié)算的業(yè)務。
消費: 消費者在商戶進行消費時,直接按實際消費金額進行結(jié)算的業(yè)務。
開始集成
商戶配置
static NSString *kLLOidPartner = @"201606301000000000"; // 商戶號
static NSString *kLLPartnerKey = @"ABCDEFG"; // 私鑰 在連連后臺配置
static NSString *signType = @"MD5"; // 加密方式
static NSString *kAPMerchantID = @"merchant.com.apple.hehe"; // 與開發(fā)證書 MerchantID 保持一致
屬性 及 代理
@interface ViewController ()<LLPaySdkDelegate>
@property (weak, nonatomic) IBOutlet UIButton *payBtn; // 支付按鈕
@property (nonatomic, retain) NSMutableDictionary *orderParam; // 訂單配置字典
@property (nonatomic, strong) LLAPPaySDK *paySdk; // 連連SDK
@end
點擊支付按鈕執(zhí)行支付方法
- (IBAction)toPay:(id)sender {
[self fillOrderMethodAndUserinfo];
self.orderParam = [self createOrder];
NSDictionary *orderParam = self.orderParam; // 創(chuàng)建訂單
self.paySdk = [LLAPPaySDK sharedSdk]; // 創(chuàng)建SDK
self.paySdk.sdkDelegate = self; // 設置回調(diào)
// 連連加密訂單的方法生成sign,如果和支付寶沖突無解就翻翻我發(fā)的文章吧
LLPayUtil *payUtil = [[LLPayUtil alloc] init];
orderParam = [payUtil signedOrderDic:orderParam andSignKey:kLLPartnerKey];
// 彈出蘋果支付界面
[self.paySdk payWithTraderInfo:orderParam inViewController:self];
}
支付按鈕的一些方法
- (NSMutableDictionary *)createOrder
{
NSDateFormatter *dateFormater = [[NSDateFormatter alloc] init];
[dateFormater setDateFormat:@"yyyyMMddHHmmss"];
NSString *simOrder = [dateFormater stringFromDate:[NSDate date]];
NSMutableDictionary *param = [NSMutableDictionary dictionary];
// 這里的dictionary參數(shù)全弄成字符串型,否則崩潰找不到錯在哪了,本人在這里掉了很長時間的坑。。。
[param setDictionary:@{
@"sign_type" : signType, // 加密方式
@"busi_partner" : @"109001", // 虛擬商品銷售:101001 實物商品銷售:109001
@"dt_order" : simOrder, // 訂單時間
@"notify_url" : @"http://test.yintong.com.cn:80/apidemo/API_DEMO/notifyUrl.htm", // 回調(diào)自家后臺的stringURL
@"no_order" : @"123456", // 訂單號
@"name_goods" : @"testName", // 商品名
@"info_order" : simOrder, // 備注
@"valid_order" : @"10080", // 訂單有效時間 多長時間過期
@"user_id" : @"123", // 用戶ID
}];
// 風險控制參數(shù)(參數(shù)需求按照文檔表格)
// 文檔地址 https://apple.lianlianpay.com/OpenPlatform/api_reference.jsp
NSString *phoneNum = @"13812345678";
NSDictionary *riskDict = @{
@"user_info_mercht_userno" : @"123",
@"user_info_dt_register" : @"123",
@"frms_ware_category" : @"4999", // 官方文檔中有
@"user_info_bind_phone" : phoneNum,
};
param[@"risk_item"] = [LLPayUtil jsonStringOfObj:riskDict]; // 風控參數(shù)
param[@"money_order"] = @"0.01";
// 這兩項一定寫對,否則出錯,如果出錯在官方后臺檢查配置,同時檢查蘋果開發(fā)者網(wǎng)站
param[@"ap_merchant_id"] = kAPMerchantID; // 與蘋果配置保持一直
param[@"oid_partner"] = kLLOidPartner; // 商戶號
return param;
}
- (NSString*)fillOrderMethodAndUserinfo{
[self.orderParam removeObjectForKey:@"acct_name"];
[self.orderParam removeObjectForKey:@"id_no"];
[self.orderParam removeObjectForKey:@"no_agree"];
[self.orderParam removeObjectForKey:@"card_no"];
return nil;
}
Demo中的delegate方法 剛集成時務必復制,以便查找錯誤原因
- (void)paymentEnd:(LLPayResult)resultCode withResultDic:(NSDictionary *)dic
{
NSString *msg = @"支付異常";
switch (resultCode) {
case kLLPayResultSuccess:
{
msg = @"支付成功";
NSString* result_pay = dic[@"result_pay"];
if ([result_pay isEqualToString:@"SUCCESS"])
{
//
// NSString *payBackAgreeNo = dic[@"agreementno"];
//_agreeNumField.text = payBackAgreeNo;
}
else if ([result_pay isEqualToString:@"PROCESSING"])
{
msg = @"支付單處理中";
}
else if ([result_pay isEqualToString:@"FAILURE"])
{
msg = @"支付單失敗";
}
else if ([result_pay isEqualToString:@"REFUND"])
{
msg = @"支付單已退款";
}
}
break;
case kLLPayResultFail:
{
msg = @"支付失敗";
}
break;
case kLLPayResultCancel:
{
msg = @"支付取消";
}
break;
case kLLPayResultInitError:
{
msg = @"sdk初始化異常";
}
break;
case kLLPayResultInitParamError:
{
msg = dic[@"ret_msg"];
}
break;
default:
break;
}
NSString *showMsg = [msg stringByAppendingString:[LLPayUtil jsonStringOfObj:dic]];
[[[UIAlertView alloc] initWithTitle:@"結(jié)果"
message:showMsg
delegate:nil
cancelButtonTitle:@"確認"
otherButtonTitles:nil] show];
}
引用官方
以下是連連官方ReadMe整理格式后
LLPaySDK iOS接入指南
文件說明
- 內(nèi)部包含 LLPay 的支付SDK
- LLPaySDK_iOS下載
- 連連 ? Pay SDK下載
- 文件夾內(nèi)文件說明
文件 | 文件內(nèi)容 |
---|---|
LLPaySdk.h | 頭文件,聲明接口 |
libPaySdkColor.a | 單獨的LLPay 的 lib庫 或者 單獨的LLAPPay 的 lib庫 |
walletResources.bundle | LianlianPay 資源包,請勿改名(如果是? Pay可不用) |
下面是基本的接入指南:
- 導入文件
- 添加頭文件引用 #import "LLPaySdk.h"
- 設置link標志
- Target->Build Setting ,Other Linker Flags 設置為 -all_load
- 可能添加-all_load以后和其他庫沖突,可以嘗試使用 -force_load 單獨load庫, force_load后面跟的是 lib庫的完整路徑```
-force_load $(SRCROOT)/***/libPaySdkColor.a (****需要按照你的庫放置的路徑?jīng)Q定)
4. 調(diào)用sdk顯示,注意retain修飾,自動釋放以后,調(diào)用后會導致程序崩潰或者有些圖片會消失(如導航欄返回圖片等)
```
NSDictionary *orderParam = @{*****}; // 創(chuàng)建訂單
self.sdk = [LLPaySdk sharedSdk]; // 創(chuàng)建SDK
self.sdk.sdkDelegate = self; // 設置回調(diào)
NSDictionary* signedDic = [payUtil signedOrderDic:orderParam andSignKey:md5key_or_rsakey] // 加過簽名的訂單字典
[self.sdk presentLLPaySDKInViewController: rootVC withPayType: LLPayTypeQuick andTraderInfo: signedDic];
```
> 接入什么類型的支付產(chǎn)品就傳什么類型的payType,如果**LLPayType傳錯就會提示無此支付產(chǎn)品權限**
> 假如是ApplePay, 使用LLAPPaySDK,并在orderParam中設置**ap_merchant_id**
```
// 消費
- (void)payWithTraderInfo:(NSDictionary *)traderInfo
inViewController:(UIViewController *)viewController;
```
5. 編寫結(jié)果回調(diào)
```
// 訂單支付結(jié)果返回,主要是異常和成功的不同狀態(tài)
- (void)paymentEnd:(LLPayResult)resultCode withResultDic:(NSDictionary *)dic
```
### LLPaySDK可配置部分
---
> iOS SDK可以通過修改資源bundle進行定制, 因為是在bundle里面,請在修改好以后 **clean proj**,這樣才會生效。
1. 圖片的替換,在內(nèi)部的圖片可以替換修改為自己的樣式
2. 顏色等的修改,可以修改default.css文件,支持#abcdef,123,123,123兩種顏色表示
3. 修改值意義列表
修改的對象 |修改方法
---|---
導航欄顏色 |替換ll_nav_bg3.png文件,以及修改css文件中NavBar字段(后面只表示字段,都是在default.css文件中)中的background-color
導航欄標題 |NavBar字段中的titleIconName; titleText
確認按鈕 |#a-button
取消按鈕 |#b-button
文本框 |UITextField
4. 參數(shù)字段部分
- 參數(shù)說明在demo中有,可以參考。字段名和wap不一致,請參考[demo(點擊下載)](http://open.lianlianpay.com/wp-content/uploads/2014/08/LLPayDemo1230-2015-12-30-031859.zip)中的參數(shù)說明,參數(shù)中的user_id 不是商戶號,是商戶自己體系中的用戶編號,前置卡輸入時,no_agree是通過API查詢得到的綁卡序號
5. 使用部分
- Demo中的輸入項,是用來測試各種支付條件,包括認證支付(輸入姓名,身份證),前置支付(輸入卡號,協(xié)議號)。不是必須,請根據(jù)自己的支付方式測試。
- 支持銀行數(shù)量,是根據(jù)支付類型以及商戶來,可以配置,請聯(lián)系運營。
### 常見問題
---
> **簽名請盡量使用服務器端簽名,假如使用客戶端簽名,請使用Demo中的payutil**
[連連支付對接常見問題](http://test.yintong.com.cn/asklianlian/)
1. **運行直接崩潰**
- 1、sdk沒有retain保管。
- 2、sdk中使用了類擴展,請在other Linker Flags中添加 -all_load
2. **提示初始化錯誤**
- 1、檢查環(huán)境和商戶號等是否匹配;
- 2、檢查簽名方法是否正確(參考簽名工具);
- 3、訂單信息是否有遺漏項;
3. 所傳的類型**不是NSString**
- 解釋:連連的訂單需要傳入的訂單格式為{“strkey”: “strvalue”, “strkey1″ : “strvalue2“},請不要傳遞 {“key”: [v1, v2]} 或者 {“key”: {“ikey”:”v”}} 這種
- 應對,修改訂單內(nèi)值的格式,特別是risk_item,需要變成 {“risk_item”:”{\”r_key\”:\”v\”}”}這樣,由于有些信息商戶是由后臺傳入,請*保證使用后臺傳給客戶端的值也是NSString類型*
4. 商戶**無此支付產(chǎn)品權限**
- 解釋:我們的產(chǎn)品分為認證支付、快捷支付等多種支付方式。一種支付方式對應的包、支付調(diào)用方法、商戶號都有所不同。
- 應對:先檢查商戶號是否是正確的商戶號,比如 <認證支付測試商戶號 201408071000001543> <快捷支付測試商戶號 201408071000001546>
然后檢查所對應的包或者調(diào)用方法對不對。
5. 商戶**無此支付權限**
- 解釋:一個商戶號對應的商品業(yè)務類型是有限的。
- 應對:修改 商戶業(yè)務類型 busi_partner 是 String(6)
- 虛擬商品銷售:101001
- 實物商品銷售:109001
- 外部賬戶充值:108001
6. 簽名驗證不對
- [簽名驗證錯誤解決](http://test.yintong.com.cn/asklianlian/?cat=10)
- 解釋:簽名有特定規(guī)則,訂單里面的特定參數(shù)參與簽名。
- 應對:ios最新的Demo中提供了payUtil函數(shù),直接調(diào)用,就能生成簽名正確的訂單。然后再次提醒,我們**強烈建議商戶在服務器端完成簽名操作**。