IOS APP端京东支付集成
京东支付没有现成的SDK, 使用的是加载html。因此,在集成京东支付的时候,我们使用webView来进行加载显示支付的页面。
京东支付需要传递多个参数才能拉起支付页面,那么我们怎么样获得和传递参数呢?
1.我们需要与自己的后台进行交互,通过网络请求,获取到拉起支付页面所需要的参数,并将参数解析成字符串进行保存。
2.在选择京东支付方式之后, 跳转到一个由Viewcontroller控制webView的场景下,将webView的delegate指向当前的ViewController。将获取到的参数, 通过网络请求传递给京东的后台进行验证,京东后台及html页面地址为 : https://m.jdpay.com/wepay/web/pay
在viewDidLoad方法中调用如下方法:
-(void)viewDidLoad {
//通过AFN向京东发送参数并进行验证,并获取支付的html路径
[selfloadTheJDRequest];
}
-(void)loadTheJDRequest {
ShowIndicatorWithMessage(@"正在跳转请稍后");
NSMutableDictionary *formDic = [[NSMutableDictionaryalloc]init];
[formDic setObject:self.getDic[@"successCallbackUrl"] ? self.getDic[@"successCallbackUrl"] :@""forKey:@"successCallbackUrl"];
[formDic setObject:self.getDic[@"tradeDescription"] ? self.getDic[@"tradeDescription"] :@""forKey:@"tradeDescription"];
[formDic setObject:self.getDic[@"tradeTime"] ? self.getDic[@"tradeTime"] :@""forKey:@"tradeTime"];
[formDic setObject:self.getDic[@"tradeNum"] ? self.getDic[@"tradeNum"] :@""forKey:@"tradeNum"];
[formDic setObject:self.getDic[@"tradeName"] ? self.getDic[@"tradeName"] :@""forKey:@"tradeName"];
[formDic setObject:self.getDic[@"merchantRemark"] ? self.getDic[@"merchantRemark"] :@""forKey:@"merchantRemark"];
[formDic setObject:self.getDic[@"version"] ? self.getDic[@"version"] :@""forKey:@"version"];
[formDic setObject:self.getDic[@"currency"] ? self.getDic[@"currency"] :@""forKey:@"currency"];
[formDic setObject:self.getDic[@"merchantSign"] ? self.getDic[@"merchantSign"] :@""forKey:@"merchantSign"];
//获取本地保存的token值
NSString *JDToken = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"JDTOKEN"];
NSLog(@"-------------%@",JDToken);
[formDic setObject:JDToken ? JDToken :@""forKey:@"token"];
[formDic setObject:self.getDic[@"tradeAmount"] ? self.getDic[@"tradeAmount"] :@""forKey:@"tradeAmount"];
[formDic setObject:self.getDic[@"notifyUrl"] ? self.getDic[@"notifyUrl"] :@""forKey:@"notifyUrl"];
[formDic setObject:self.getDic[@"merchantNum"] ? self.getDic[@"merchantNum"] :@""forKey:@"merchantNum"];
[formDic setObject:self.getDic[@"failCallbackUrl"] ? self.getDic[@"failCallbackUrl"] :@""forKey:@"failCallbackUrl"];
//通过AFN提交参数
AFHTTPRequestOperationManager *manager=[AFHTTPRequestOperationManagermanager];
manager.responseSerializer.acceptableContentTypes=[NSSetsetWithObjects:@"text/html",@"text/javascript",nil];
manager.responseSerializer=[AFHTTPResponseSerializerserializer];
[manager POST:self.getDic[@"jdReqUrl"]parameters:formDicsuccess:^(AFHTTPRequestOperation *operation,id responseObject) {
NSString *htmlstring=[[NSStringalloc]initWithData:responseObjectencoding:NSUTF8StringEncoding];
//将第二次请求出来的html字符串加载到webview
[self.chargeWebViewloadHTMLString:htmlstringbaseURL:[NSURLURLWithString:self.getDic[@"jdReqUrl"]]];
} failure:^(AFHTTPRequestOperation *operation,NSError *error) {
}];
}
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
ShowTips(@"数据加载出错啦!");
}
-(void)viewWillDisappear:(BOOL)animated {
[superviewWillDisappear:animated];
HideIndicator();
}
3.根据回调进行判断是否支付成功, 回调地址中包含token字段及其信息, 则表示支付成功,否则支付失败。 此处的token值获取到之后, 保存在本地, 在步骤2中向京东发送参数时, token不为空时,拉起的支付页面显示带有银行卡的界面, 若token为空时, 则显示京东的登录界面。
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSLog(@"============%@",request.URL);
if ([request.URL.absoluteStringrangeOfString:@"call_back_url"].location !=NSNotFound) {
if ([request.URL.absoluteStringrangeOfString:@"token"].location !=NSNotFound) {
NSLog(@"-------------充值成功");
NSString *token = [[request.URL.absoluteStringcomponentsSeparatedByString:@"token="]lastObject];
NSString *gettoken = [[tokencomponentsSeparatedByString:@"&"]firstObject];
NSLog(@"-------------%@",gettoken);
[[NSUserDefaultsstandardUserDefaults]setObject:gettokenforKey:@"JDTOKEN"];
[[NSUserDefaultsstandardUserDefaults]synchronize];
[self.navigationControllerpopToViewController:self.navigationController.viewControllers[self.navigationController.viewControllers.count - 3] animated:YES];
} else {
NSLog(@"-------------充值失败");
UIAlertView *alt=[[UIAlertViewalloc]initWithTitle:@"支付失败"message:nildelegate:selfcancelButtonTitle:@"稍后尝试"otherButtonTitles:@"再次提交",nil];
alt.tag=1000;
[alt show];
}
}
returnYES;
}
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (alertView.tag ==1000) {
if (buttonIndex == alertView.cancelButtonIndex) {
[self.navigationControllerpopToViewController:self.navigationController.viewControllers[self.navigationController.viewControllers.count - 3] animated:YES];
} else {
[selfloadTheJDRequest];
}
}
}
-(void)webViewDidFinishLoad:(UIWebView *)webView {
HideIndicator();
}
5.注意事项:
(1)京东支付,每天只有五次支付机会,支付五次之后,会提示一些京东默认的错误信息及带有错误信息的界面。
(2)首次与后台交互时,返回的token值必定为空,拉起之后进入登录界面, 当支付成功之后,才会有token的信息在京东的回调地址中,此时前端或者后端截取之后保存到本地即可下次直接之用
(3)回调地址中包含token才表示成功, 否则失败。
Demo下载地址: http://download.csdn.net/detail/svendson/9512589
IOS APP端京东支付集成相关推荐
- 苹果手机 微信PHP问题,安卓、ios APP调用微信支付时,页面出现空白 。(php微信支付,app发起微信支付白屏)?...
安卓.ios APP调用微信支付时,页面出现空白 我的后端是用php开发的.我是先调用微信的统一下单生成,生成prepay_id预支付订单号,代码如下: public function send_pa ...
- 微信境外支付php_PHP实现 APP端微信支付功能
前面已经写了手机APP支付宝支付,今天再把手机APP微信支付补上,前期的准备工作在这里就不多说了,可以参考微信支付开发文档,一定要仔细阅读开发文档,可以让你少踩点坑:准备工作完成后就是配置参数,调用统 ...
- php微信app支付教程,PHP APP端微信支付的方法
这篇文章主要介绍了关于PHP APP端微信支付的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 前面已经写了手机APP支付宝支付,今天再把手机APP微信支付补上,前期的准备工作在这 ...
- 用PHP开发APP端微信支付
用PHP开发APP端微信支付的一点个人心得 最近因为公司需求,要开发APP端上的微信支付,看了微信文档,感觉还不错,没有遇到太大的坑,需要注意的点不算太多. 写一个记事文档,作为备忘录. APP支付流 ...
- app端微信支付(二) - 生成预付单
前一篇文章的时序图中说了,app端调用微信支付必须先由后台调用微信后台生成预付单,再构建参数给手机端,而数据的构建要以xml形式,那么看看代码具体实现吧,代码已经精简过了,自己的业务已经除去,精简的 ...
- iOS应用之微信支付集成
1. 准备工作 工程所需的微信支付SDK,如下图: 导入工程的SDK文件 微信支付所需的相关用户信息(由用户申请) //微信支付商户号#define MCH_ID @"YOUR_MCH_ID ...
- 京东支付集成遇到的问题记录
集成京东支付时遇到的问题在此记录,望小伙伴不再进坑 步骤一: 在module_base_ui的build.gradle中android代码块里添加 sourceSets { main { jniLib ...
- iOS应用之微信支付集成-直接前端集成
所有信息的生成都在前端完成,包括对订单进行sign签名以及MD5签名加密(此方法相对来说有些复杂,没有官方给的方法简单). 注:官方给的是v3&v4支付流程,签名和加密都是在服务器端进行,由于 ...
- PHP APP端支付宝支付
应业务需求,做了支付宝支付和微信支付,今天分享一下手机端app支付宝支付对接流程,实际开发过程是前后端分离,前端调用后端API接口,实现功能返回数据,我所用的跨挤啊为TP5,大致可以分为四步: 1.在 ...
最新文章
- 简单的文本框输入实时计数
- RHlinux下安装VORACLE VM VIRTUAL BOX
- 谈谈机器学习的基本问题,不谈数学!
- 高压放电与防静电塑料包装
- eclipse php 环境及调试配置
- 鸿蒙硬件HI3861-I2C-MCP23017
- SQL Server 2014新特性:其他
- TOGAF9.2第I部分 第2章核心概念
- Mixly 二次开发 自定义库 OLED
- C语言克莱姆法解方程组解析,解线性方程组用克莱姆法则
- 机械制造技术类毕业论文文献都有哪些?
- No implementation found for void java接口不能跳转到实现类
- 快手Java开发二面面经分享
- Android开发范例实战宝典
- 审查指南关于计算机可读介质,中美专利申请中对“计算机可读介质”的可专利性差异...
- 服务器Redis实例中挖矿病毒排查及处理
- surface 通过U盘 镜像恢复系统
- qt中ui的 使用介绍
- 点分治动态点分治小结
- tryhackme-Bolt