如何在Objective-C中调用指定支付类Soap API?附接口详情
在Objective-C中调用支付类SOAP API的实现方案
我来帮你梳理下在Objective-C里调用这两个SOAP支付接口的具体实现步骤,直接上可落地的代码和说明:
通用前提说明
SOAP请求本质是基于HTTP的XML请求,核心步骤就是:
- 构建符合接口要求的SOAP Envelope(XML格式)
- 发送POST请求到指定接口地址
- 解析返回的XML响应,提取需要的业务参数
下面针对两个接口分别给出实现示例:
1. 调用GetPaymentModeData接口(获取可用支付方式)
请求参数说明
需要传入三个必填参数:
- OrderId:订单ID
- LoyaltyRequestId:会员请求ID
- MemberId:会员ID
实现代码
// 1. 填充实际业务参数 NSString *orderId = @"你的订单ID"; NSString *loyaltyRequestId = @"你的会员请求ID"; NSString *memberId = @"你的会员ID"; // 2. 构建SOAP请求体(严格匹配接口的XML结构) NSString *soapMessage = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>" "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" "<soap:Body>" "<GetPaymentModeData xmlns=\"http://mobile.cinemaxxtheater.com/WebService/\">" "<OrderId>%@</OrderId>" "<LoyaltyRequestId>%@</LoyaltyRequestId>" "<MemberId>%@</MemberId>" "</GetPaymentModeData>" "</soap:Body>" "</soap:Envelope>", orderId, loyaltyRequestId, memberId]; // 3. 配置HTTP请求 NSURL *url = [NSURL URLWithString:@"http://mobile.cinemaxxtheater.com/WebService/你的完整接口路径"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; NSString *msgLength = [NSString stringWithFormat:@"%lu", (unsigned long)[soapMessage length]]; [request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [request addValue:@"http://mobile.cinemaxxtheater.com/WebService/GetPaymentModeData" forHTTPHeaderField:@"SOAPAction"]; [request addValue:msgLength forHTTPHeaderField:@"Content-Length"]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]]; // 4. 发送请求并处理响应 NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (error) { NSLog(@"请求出错:%@", error.localizedDescription); return; } // 先打印原始响应,方便调试 NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"原始响应XML:%@", responseString); // 解析响应参数:ErrDesc和PaymentModeList // 这里需要根据接口返回的实际XML结构编写解析逻辑,示例用NSXMLParser实现 NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; parser.delegate = self; // 记得实现NSXMLParserDelegate协议来遍历节点 [parser parse]; }]; [task resume];
响应解析提示
返回的XML中需要重点提取:
- ErrDesc:值为"0"表示请求成功,其他字符串为错误详情
- PaymentModeList:一组支付方式节点,需要遍历提取每个方式的名称、ID等信息
2. 调用PaymentCheckoutProcess接口(处理支付)
请求参数说明
需要传入五个必填参数:
- OrderId:订单ID
- UserEmail:用户邮箱
- UserMobileNo:用户手机号
- CardNumber:银行卡号(生产环境务必加密传输)
- GrossAmount:支付金额
实现代码
// 1. 填充实际业务参数 NSString *orderId = @"你的订单ID"; NSString *userEmail = @"用户邮箱"; NSString *userMobileNo = @"用户手机号"; NSString *cardNumber = @"用户卡号"; // 注意:生产环境必须加密后再传输! NSString *grossAmount = @"支付金额"; // 2. 构建SOAP请求体 NSString *soapMessage = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>" "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" "<soap:Body>" "<PaymentCheckoutProcess xmlns=\"http://mobile.cinemaxxtheater.com/WebService/\">" "<OrderId>%@</OrderId>" "<UserEmail>%@</UserEmail>" "<UserMobileNo>%@</UserMobileNo>" "<CardNumber>%@</CardNumber>" "<GrossAmount>%@</GrossAmount>" "</PaymentCheckoutProcess>" "</soap:Body>" "</soap:Envelope>", orderId, userEmail, userMobileNo, cardNumber, grossAmount]; // 3. 配置HTTP请求 NSURL *url = [NSURL URLWithString:@"http://mobile.cinemaxxtheater.com/WebService/你的完整接口路径"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; NSString *msgLength = [NSString stringWithFormat:@"%lu", (unsigned long)[soapMessage length]]; [request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [request addValue:@"http://mobile.cinemaxxtheater.com/WebService/PaymentCheckoutProcess" forHTTPHeaderField:@"SOAPAction"]; [request addValue:msgLength forHTTPHeaderField:@"Content-Length"]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]]; // 4. 发送请求并处理响应 NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (error) { NSLog(@"请求出错:%@", error.localizedDescription); return; } NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"原始响应XML:%@", responseString); // 解析响应参数:OrderId、PaymentTransId、ErrDesc // 同样根据实际XML结构编写解析逻辑,也可以用第三方XML库简化转换 }]; [task resume];
重要注意事项
- 银行卡号属于敏感信息,生产环境必须使用HTTPS传输,且对卡号进行加密处理,绝对不能明文传输
- 务必根据接口返回的实际XML结构调整解析逻辑,上面的代码仅提供通用框架
- 如果觉得原生XML解析繁琐,可以使用
TBXML、XMLDictionary等第三方库简化XML到字典的转换
内容的提问来源于stack exchange,提问作者swati
相关产品推荐
相关产品推荐

