美文网首页
iOS 通联支付

iOS 通联支付

作者: 雪_晟 | 来源:发表于2017-09-14 09:23 被阅读74次

    本版本是基于V4.5 版的。
    目前的 SDK 版的所有版本必须以会员模式对接。

    一共两个步骤,把下面的依赖库直接拖进去即可,至于一些Build Settings选项的修改,你只需要对照文档看一下xcode的配置一致不。(xcode8.3.2的配置不需要做任何改变,只需要把下面的库拖进去即可)

    a)
    iOS 平台开发步骤
    APay.h
    APayRes.bundle
    libAPayLib.a
    APMPPassGuardCtrlBundle.bundle TrustDefenderMobile.framework
    文件拷贝到需要引用通联支付插件的工程目录下;`
    f) 工程中添加以下依赖库:
    CoreTelephony.framework CoreLocation.framework Security.framework SystemConfiguration.framework
    QuarzCore.framework
     CoreText.framework AudioToolbox.framework CoreGraphics.framework libstdc++.6.0.9.dylib
    

    通联支付id 由后台注册。前段对应的通联id的字段为 ext1

    只说明针对md5验签。
    MD5加密的key 给后台要即可。
    商户需通过 mode 字段切换测试环境和生产环境
    当前连接的通联支付环境。
    mode=”01” 测试环境
    mode=”00” 生产环境

    需要注意的是所有的参数必须按照文档的顺序填写,00环境才可以支付。(通联支付的支付插件真的很垃圾)

    -(void)rechargeCard{
        
        NSInteger amount =  1; //以分为计算单位
        
        //商户订单生成日期
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyyMMddHHmmss"];
        NSDate *workDate = [NSDate dateWithTimeIntervalSinceReferenceDate:[NSDate timeIntervalSinceReferenceDate]];
        NSString *timeStr = [dateFormatter stringFromDate:workDate];
        
        //商户订单号
        NSString *orderStr = [NSString stringWithFormat:@"%ld",[NSString getNowInterVal]];
        
        //####################################  计算外卡扩展信息字段签名  ######################################//
        NCUserInfoModel *infoModel = [NCUserInfoManager getUserInfo];
        NSString *ext1 = [NSString stringWithFormat:@"<USER>%@</USER>",infoModel.tonglianUserId];
        
        //##################################################################################################//
        
        NSArray *paaDic = @[
                            
                            ////协议字符集 1-UTF-8  2-GBK; 3-GB2312
                            @"1", @"inputCharset",
                            
                            //支付通知结果以此为准,后台通知商户网站支付结 果的 url 地址
                            //                         @"http://www", @"receiveUrl",
                            @"http://119.28.62.27:8080/ytr/appcard/orderPayment", @"receiveUrl",
                            
                            ////协议版本,固定填 v1.0
                            @"v1.0", @"version",
                            
                            //指定当前语言
                            //固定选择值:1-简体中文 2-繁体中文 3-英文
                            //可不填
                            //非外卡支付只支持简体中文
                            //外卡支付若未指定语言则默认为系统语言,若系统语言不被支持则默认为英文
                            @"1", @"language",
                            
                            //订单信息签名方式
                            @"0", @"signType",
                            
                            //通联分配给商户的ID
                            @"xxxxx", @"merchantId",                                    //商户当前支付订单号
                            orderStr, @"orderNo",
                            
                            //订单支付金额
                            //分做单位
                            //最小0.01元
                            @"1", @"orderAmount",
                            
                            //针对非跨境和非外卡支付
                            //payType=27
                            //支持以下币种: 默认[人民币]-0 人民币-156
                            @"0", @"orderCurrency",
                            
                            //商户生成订单时间戳
                            //必须允许的订单时间范围内
                            timeStr, @"orderDatetime",
                            
                            //商品名称
                            @"会员卡", @"productName",
                            
                            //对于非外卡支付
                            //商户用户号在通联会员系统对应的会员号
                            ext1, @"ext1",//若商户用户未注册通联会员号,该行不需要,可以注释掉
                            self.cardIdModel.ID ,@"ext2",
                            @"33", @"payType",
                            @"1234567890", @"key",
                            ];
        NSString *paaStr = [self formatPaa:paaDic];
        
        //        paaStr = [NSString stringWithFormat:@"&%@&",paaStr];
        [APay startPay:paaStr viewController:self delegate:self mode:@"00"];
    
        
    }
    - (void)APayResult:(NSString *)result {
        
        NSLog(@"%@", result);
        NSArray *parts = [result componentsSeparatedByString:@"="];
        NSError *error;
        NSData *data = [[parts lastObject] dataUsingEncoding:NSUTF8StringEncoding];
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
        NSInteger payResult = [dic[@"payResult"] integerValue];
        //    NSString *format_string = @"支付结果::支付%@";
        if (payResult == APayResultSuccess) {
            
            [LXNotificationCenter postNotificationName:UPDATEORDERSTATUE object:nil];
            [self.view makeToast:@"支付成功"];
            [self delayAction];
        } else if (payResult == APayResultFail) {
            
            [self.view makeToast:@"支付失败"];
        } else if (payResult == APayResultCancel) {
            
            [self.view makeToast:@"支付被取消"];
            
        }
    }
    
    - (NSString *)formatPaa:(NSArray *)array {
        
        NSMutableDictionary *mdic = [NSMutableDictionary dictionary];
        
        NSMutableString *paaStr = [[NSMutableString alloc] init];
        for (int i = 0; i < array.count; i++) {
            [paaStr appendFormat:@"%@=%@&", array[i+1], array[i]];
            mdic[array[i+1]] = array[i];
            i++;
        }
        
        NSString *signMsg = [self md5:[paaStr substringToIndex:paaStr.length - 1]];
        mdic[@"signMsg"] = signMsg.uppercaseString;
        
        //############################  卡号回显请参考以下部分  ##############################################//
        
        //卡号回显需要在订单信息中传入该字段
        //该字段不参与订单信息的签名计算
        //若不需要卡号回显的功能该字段可不传入
        //    NSString *cardNo = @"4391880000000004";//测试用信用卡
        //                       @"6225882120759623";//测试用借记卡
        //    mdic[@"cardNo"] = cardNo;
        
        //##################################################################################################//
        
        //############################  外卡支付订单添加扩展信息字段  ###########################################//
        
        //    [mdic addEntriesFromDictionary:[self extPart]];
        
        //##################################################################################################//
        
        if (mdic[@"key"]) {//商户私有签名密钥 通联后台持有不传入插件
            [mdic removeObjectForKey:@"key"];
        }
        
        NSError *error;
        NSData *data = [NSJSONSerialization dataWithJSONObject:mdic options:NSJSONWritingPrettyPrinted error:&error];
        NSString *jsonStr = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding];
        
        [paaStr setString:jsonStr];
        
        return paaStr;
    }
    - (NSString *)md5:(NSString *)string {
        
        NSLog(@"%@", string);
        
        if (string == nil) { return nil; }
        
        const char *str = [string cStringUsingEncoding:NSUTF8StringEncoding];
        CC_LONG strLen = (CC_LONG)[string lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
        unsigned char *result = calloc(CC_MD5_DIGEST_LENGTH, sizeof(unsigned char));
        CC_MD5(str, strLen, result);
        
        NSMutableString *hash = [NSMutableString string];
        for (int i = 0; i < CC_MD5_DIGEST_LENGTH; ++i) {
            [hash appendFormat:@"%02x", result[i]];
        }
        
        free(result);
        
        return hash;
    }
    
    

    相关文章

      网友评论

          本文标题:iOS 通联支付

          本文链接:https://www.haomeiwen.com/subject/twprsxtx.html