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.在 ...
最新文章
- 2022-2028年中国塑胶模具行业市场专项调研及前瞻分析报告
- OkHttp源码分析
- Android Studio Intent使用(显式、隐式)
- art-template辅助函数和子模板
- ElasticSearch聚合分析
- go interface类型转换_Go语言的九大核心特性主要有哪些?
- 2018-08-10 Netty:4.x
- POJ NOI0101-08 字符三角形
- JAVA中map删除键值对_以有效的方式从Map中删除多个键?
- build.xml:391: javac doesn‘t support the “nativeheaderdir“ attribute
- 如何优雅的进行W10远程控制
- PS怎么做出水彩油画喷溅效果图片
- 数据流程图,业务流程图,模块结构图
- 天尚网最新单机游戏下载,直接下载哦!
- 计算机常用的数字编码是什么意思,编码是什么意思
- 微信小程序开发学习5(自定义组件)
- MySQL--找出每个部门薪水最高的员工 方法总结
- python绘图用什么软件_作图用什么软件比较好?
- android 接收闹钟广播,Android获取第三方闹钟的闹铃信息
- 什么是计算机器语言?
热门文章
- [IDE] 使用教育邮箱申请免费激活JetBrains
- thinkpad E14 ubuntu1804 wifi不可用
- 本田裂行125保养里程参数
- 苹果2019财年第二财季财报前瞻:分析师预计营收将继续下滑
- 余额宝体验金领取方法,最高体验金达100万
- java实现excel批量导入图片到服务器
- 粉丝福利 | 送书和键盘鼠标
- 86.(cesium篇)cesium叠加面接收阴影效果(gltf模型)
- KEIL 声明隐晦declared implicitly和重复定义symbol multiply defined
- 计算机主机电源的构造,PC电源内部结构探秘:原来水这么深