[UnionPay]银联支付

文章涉及的demo在Github LQThirdParty, 欢迎Star | Fork

本文主要是介绍银联支付相关的一些

一. 前期准备

  1. 打开银联开放平台:https://open.unionpay.com/tjweb/index;
  2. 选择“产品API”-->商户专区-->手机支付控件;

打开后,在“产品简介”中有我要入网我要测试,均需要注册账号,根据提示完成注册即可!

二. 适配iOS9

在iOS9下,默认使用的是HTTPS协议,系统会拦截对HTTP协议接口的访问,因此无法获取HTTP协议接口的数据,

解决方案

具体方法:
在项目的Info.plist中添加一个Key:NSAppTransportSecurity,类型为字典类型。
然后给它添加一个Key:NSAllowsArbitraryLoads,类型为Boolean类型,值为YES

配置Info.plist文件

三. 导入银联SDK

SDK&Demo下载页,可以下载相关的iOS开发包,里面有后台说明,app说明等,在app开发包 中有iOS 相关SDK和集成文档,将paymentcontrol文件夹内文件添加到项目中:

libPaymentControl.aUPPaymentControl.hUPAPayPlugin.hUPAPayPluginDelegate.h

添加依赖库:

Build Phases -> Link Binary With Libraries添加依赖库:

SystemConfiguration.framework,liz.tbd,CFNetwork.framework

注意看下有没有libPaymentControl.a,一般添加到项目的时候会自动加进去,这里只需要注意下有没有即可:

设置URL scheme

这里的URL Scheme 是自定义的传递给银联sdk的回调scheme,在完成支付后返回app,一般以项目名称命名即可;

编译运行,如果报以下错误:

Undefined symbols for architecture armv7:  
  "_OBJC_CLASS_$_CTTelephonyNetworkInfo", referenced from:  
      objc-class-ref in libWeChatSDK.a(MTAHelper.o)  

这是因为还需要添加库文件:CoreTelephony.framework

配置SSO白名单

在iOS9以上系统需要增加一个可跳转App的白名单,即LSApplicationQueriesSchemes, 否则将在SDK判断是否跳转时用到的canOpenURL时返回NO,进而只进行webview授权或授权/分享失败.
在项目中的info.plist中加入应用白名单,右键info.plist选择source code打开,添加以下内容:

<key>LSApplicationQueriesSchemes</key>
<array>
        <string>uppaysdk</string>
        <string>uppaywallet</string>
        <string>uppayx1</string>
        <string>uppayx2</string>
        <string>uppayx3</string>

</array>

四. 使用银联的API

在需要使用银联支付的地方导入:

#import "UPPaymentControl.h"  
  • 判断是否安装 银联 App
+ (BOOL) isUnionAppInstall {
    
    return [[UPPaymentControl defaultControl] isPaymentAppInstalled];
}

这个判断可加可不加, 如果用户没有安装银联app, 则会调用 SDK 内置的收银台进行收款.

  • 发起支付
/**
 *  支付接口
 *
 *  @param tn             订单信息
 *  @param schemeStr      调用支付的app注册在info.plist中的scheme
 *  @param mode           支付环境
 *  @param viewController 启动支付控件的viewController
 *  @return 返回成功失败
 */
- (BOOL)startPay:(NSString*)tn
      fromScheme:(NSString *)schemeStr
            mode:(NSString*)mode
  viewController:(UIViewController*)viewController;

首先调用商户后台接口, 完成下单, 返回交易流水号(TN), 然后调用 SDK 的 startPay 方法进行支付:

+ (void) startPayWithTN:(NSString *)tn onViewController:(UIViewController *) vc {
    
    [[UPPaymentControl defaultControl] startPay:tn fromScheme:@"LQUnionPayDemo" mode:@"01" viewController:vc];
}

该方法有四个参数:
参数一: tn, 交易流水号, 由商户后台向银联后台提交订单信息后, 由银联后台生成下发;
参数二: schemeStr, app端定义的回调scheme
参数三: mode ,接入模式, 有两个可选值, @“00” 生产环境, @“01” 测试环境
参数四: viewController, 发起调用支付控件的视图控制器
返回值: 是否吊起支付成功

  • 处理支付结果
/**
 *  处理钱包或者独立快捷app支付跳回商户app携带的支付结果Url
 *
 *  @param url              支付结果url,传入后由SDK解析
 *  @param completionBlock  结果回调,保证跳转钱包支付过程中,即使调用方app被系统kill时,能通过这个回调取到支付结果。
 */

- (void)handlePaymentResult:(NSURL*)url completeBlock:(UPPaymentResultBlock)completionBlock;

在工程AppDelegate文件的application: openURL: options: 和 application: openURL: sourceApplication:annotation: 方法中进行调用:

- (BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    

    [[UPPaymentControl defaultControl] handlePaymentResult:url completeBlock:^(NSString *code, NSDictionary *data) {
        
       if ([url.host isEqualToString:@"paydemo"]) { 
    [[UPPaymentControl defaultControl] handlePaymentResult:url completeBlock:^(NSString *code, NSDictionary *data) {
        
        if([code isEqualToString:@"success"]) {
            //结果code为成功时,去商户后台查询一下确保交易是成功的再展示成功
        }
        else if([code isEqualToString:@"fail"]) {
            //交易失败
        }
        else if([code isEqualToString:@"cancel"]) {
            //交易取消
        }
    }];
}
    
    return YES;
}

// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
if ([url.host isEqualToString:@"paydemo"]) { 
    [[UPPaymentControl defaultControl] handlePaymentResult:url completeBlock:^(NSString *code, NSDictionary *data) {
        
        if([code isEqualToString:@"success"]) {
            //结果code为成功时,去商户后台查询一下确保交易是成功的再展示成功
        }
        else if([code isEqualToString:@"fail"]) {
            //交易失败
        }
        else if([code isEqualToString:@"cancel"]) {
            //交易取消
        }
    }];
}
    
    
    return YES;
}

PS:这里回调的url.host是 paydemo ,感觉有点奇怪

然后, 在上面的回调 Block 中进行支付结果的验证;

到此,一个完整的支付流程就完成了...

支付页面

如果已安装 云闪付 app,则会跳转到云闪付的支付页:


安装 云闪付 app

如果未安装 云闪付 app,则会app内吊起支付控件


未安装 云闪付 app

附加

  • 银联应答码

https://open.unionpay.com/ajweb/help/respCode/respCodeList

在调试中出现问题, 一般都会附有应答码, 可根据应答码在这里进行查询, 定位问题;

  • 支付结果验证

关于支付结果验证, 官方提供的 demo 中本地验证的方法, 需要用到开放平台生成的签名证书, 而且在验证前需要保证该签名证书是最新的, 所以, 一般将验证的过程放在服务端, 即, 在支付完成后, 调用后台提供的结果查询接口进行验证.

文章涉及的demo在Github LQThirdParty, 欢迎Star | Fork

(完)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 银联支付,支付宝支付,微信支付的三大总结,之前也有写过两篇。 微信支付,支付宝支付,银联支付——三大支付总结: h...
    LucasAdam阅读 4,789评论 2 23
  • 很可能你的应用是与一个支持HTTPS传输数据的服务器交互,但是并没有使用TLS 1.2或更高。在这种情况下,你定义...
    Www刘阅读 2,958评论 0 5
  • 02-26[香帅的北大金融学课] 今天是第一个小专题,金融学中非常有意思的悖论,叫做“市场有效悖论”。2013年的...
    早知今日阅读 1,752评论 0 1
  • 6.2……316 目中有人,才有路,心中有爱,才有度。一个人的宽容,来自一颗善待他人的心。一个人的涵养,来自一颗尊...
    吕志萍阅读 92评论 0 0
  • 人都是有私心的吧 想要心安理得接受一个人的好 又不想去付出 一面想自由一面想关怀 最后什么都会失去吧 祝愿明天有风...
    waiting_forever阅读 97评论 0 0