这几天在工作之余看了下银联支付。基本按照官方的文档做就可以。


支付流程

银联的文档截图。

支付记录生成器 ios ios支付账单_支付记录生成器 ios

官方流程说明:

流程图说明:

(1)用户在客户端中点击购买商品,客户端发起订单生成请求到商户后台;

(2)商户后台收到订单生成请求后,按照《手机控件支付产品接口规范》组织并推送订单信息至银联后台;

(3)银联后台接收订单信息并检查通过后,生成对应交易流水号(即TN),并回复至商户后台(应答要素:交易流水号等);

(4)商户后台接收到交易流水号(TN),将交易流水号返回至客户端;

(5)客户端通过交易流水号(TN)调用支付控件;

(6)用户在支付控件中输入相关支付信息后,由支付控件向银联后台发起支付请求;

(7)支付成功后,银联后台将支付结果通知给商户后台;

(8)银联后台同时也将支付结果通知支付控件;

(9)支付控件显示支付结果并将支付结果返回至客户端;

需要前端和后台的配合。

前端要做的:

1.提交订单信息给后台;

2.后台返回交易流水号(TN)

3.调支付控件;

4.处理回调。

运行官方Demo

运行前需要先往工程里面增加两个文件:

支付记录生成器 ios ios支付账单_银联_02

绿色的两个,不然或报错。

至于其他配置参看文档就可以了。

调起支付控件:

[[UPPaymentControl defaultControl] startPay:tn fromScheme:@"UPPayDemo" mode:self.tnMode viewController:self];



处理回调

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

    [[UPPaymentControl defaultControl] handlePaymentResult:url completeBlock:^(NSString *code, NSDictionary *data) {
        //结果code为成功时,先校验签名,校验成功后做后续处理
        if([code isEqualToString:@"success"]) {
            
            //判断签名数据是否存在
            if(data == nil){
                //如果没有签名数据,建议商户app后台查询交易结果
                return;
            }
            
            //数据从NSDictionary转换为NSString
            NSData *signData = [NSJSONSerialization dataWithJSONObject:data
                                                               options:0
                                                                 error:nil];
            NSString *sign = [[NSString alloc] initWithData:signData encoding:NSUTF8StringEncoding];
            NSLog(@"sign = %@",sign);

            
            //验签证书同后台验签证书
            //此处的verify,商户需送去商户后台做验签
            if([self verify:sign]) {
                //支付成功且验签成功,展示支付成功提示
            }
            else {
                //验签失败,交易结果数据被篡改,商户app后台查询交易结果
            }
        }
        else if([code isEqualToString:@"fail"]) {
            //交易失败
        }
        else if([code isEqualToString:@"cancel"]) {
            //交易取消
        }
    }];
    
    return YES;
}