SDK包内容
image.png接入
新建一个工程,将静态的.a
文件和对应的.h
文件导入工程
需要添加CFNetwork.framework 、 S ystemConfiguration.framework 、libz.tbd、libc++.tbd
等系统库
- 文档中缺少libc++.tbd,编译会不通过,报错Undefined symbol。类似于这篇文章所描述的那样。
记 iOS Undefined symbol 的一次报错
白名单
SDK
中有检查是否安装银联APP
的功能接口。而这个功能一般是采用canOpen
这个API
来实现的。所以需要添加协议白名单,使canOpen
这个API
有效。
URL Type
支付结果以URL Scheme
的方式回传,所以需要设定一个URL Type
,让第三方唤起APP
,同时回传支付结果。这里的协议是UPPayDemo
,也可以是其他的自定义协议。以UPPayDemo
为例,其他主体可以通过类似UPPayDemo://xxx.xxx.xxx/xxx?xxx=xx&xxx=xxx
的方式唤起本身并回传结果。
开放http
SDK
分生产和测试两种模式。测试模式采用的是http
,所以需要放开http
的限制。
检查银联APP是否安装
image.png// 检测
- (IBAction)checkButtonTouched:(id)sender {
if ([[UPPaymentControl defaultControl] isPaymentAppInstalled]) {
[self showMessage:@"已安装银联支付 APP"];
} else {
[self showMessage:@"未安装银联支付 APP"];
}
}
- 模拟器上没有安装银联APP,能检查出来
支付
-
tn
由后台给,这里作为参数通过界面输入
- 参考代码
// 支付
- (IBAction)payButtonTouched:(id)sender {
// 后台给的支付凭证
NSString *tn = [self.tnTextView.text stringByReplacingOccurrencesOfString:@" " withString:@""];
// 自定义Scheme协议,在URL Type中设置
NSString *scheme = @"UPPayDemo";
// 默认是生产模式00;开关打开,切换为测试模式01
NSString *mode = @"00";
if (self.modeSwitch.isOn) {
mode = @"01";
}
// 支付
BOOL result = [[UPPaymentControl defaultControl] startPay:tn fromScheme:scheme mode:mode viewController:self];
if (!result) {
[self showMessage:@"调起支付控件失败"];
}
}
// 提示信息
- (void)showMessage:(NSString *)message {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示信息" message:message preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"知道了" style:UIAlertActionStyleDefault handler:nil]];
[self presentViewController:alert animated:YES completion:nil];
}
- 调用支付接口之后,会拉起支付界面:
- 崩溃问题:
tn
随便给一个,在拉起支付界面的时候发生崩溃,原因暂时不清楚。
实际试了一下,如果手机上安装了银联APP,就不会崩溃。
崩溃问题解决:在Build Setting
的Other Linker Flag
添加-ObjC
网上有人遇到过相同的问题,比如这两篇文章所说
银联支付--[__NSCFConstantString newSizeWithFont:forWidth:lineBreakMode:]: unrecognized selector sent to instance 0x1090d01f0'
银联支付 错误码 [__NSCFConstantString newSizeWithFont:forWidth:lineBreakMode:]: unrecognized selector sent to instance 0x1006f91b0
支付结果
在AppDelegate
文件的application: openURL: options:
方法中进行调用
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
// 判断协议,是自定义的私有协议才处理
if ([url.scheme isEqualToString:@"UPPayDemo"]) {
[[UPPaymentControl defaultControl] handlePaymentResult:url completeBlock:^(NSString *code, NSDictionary *data) {
if ([code isEqualToString:@"success"]) {
[self showMessage:@"交易成功"];
} else if ([code isEqualToString:@"fail"]) {
[self showMessage:@"交易失败"];
} else if ([code isEqualToString:@"cancel"]) {
[self showMessage:@"交易取消"];
} else {
[self showMessage:[NSString stringWithFormat:@"code:%@ data:%@", code, data]];
}
}];
} else {
[self showMessage:[NSString stringWithFormat:@"未知的协议url:%@", url.absoluteString]];
}
return YES;
}
#pragma mark - private
// 提示信息
- (void)showMessage:(NSString *)message {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示信息" message:message preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"知道了" style:UIAlertActionStyleDefault handler:nil]];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alert animated:YES completion:nil];
}
网友评论