客户端接入支付宝过程遇到的错误(版本号:1.0)
来源:互联网 发布:搜索引擎优化 名词解释 编辑:程序博客网 时间:2024/06/08 09:45
现在是2014年8月份,我在官网下载的开发文档,为何文档内版本号还是1.0,我百思不得姐!
客户端接入支付宝过程遇到的错误,今天写下来给需要的人看看!
1. Toast 出 Failure calling remote service
导入官方demo后 ,看了下官方的 文档需要配置一下key ,然后公司的同事发来了key我配置了下。
之后运行
Toast 出 Failure calling remote service
我百思不得姐 , google上百度了一下 发现需要 将RSA私钥转换成PKCS8格式
OK 问题找到了 后来问项目负责人要他之前弄好的这个 格式的文件 发给我 我赋值一下里面的PKCS8格式 密钥 OK 问题解决没有这个问题了
2.虽然 Toast 出 Failure calling remote service的问题解决了,但是接下来的是致命性的问题 程序跑起来直接崩溃了
我打开手机 的SD卡根目录看到一个log文件
com.alipay.android.app.lib.ResourceMap.getString_processing(ResourceMap.java:27)com.alipay.android.app.widget.Loading.show(Loading.java:30)com.alipay.android.app.sdk.AliPay.pay(AliPay.java:89)com.oki.lyw.activity.alipay.ExternalPartner$2.run(ExternalPartner.java:170)com.alipay.android.app.sdk.R$string
OK ResourceMap.java:27 这里有错
但是我没找到这个类,仔细找啊找 发现 少导了一个alipay_lib” 这个项目。
我擦忽然发现好像是的这点给忘了。
如果是eclipse直接在把这个alipay_lib 项目导入进来进行了,but 我现在用的android studio,额滴个神来 ,导入eclipse项目很难的。妈蛋!这咋弄?
我尝试着到导入alipay_lib.jar这个包 ,发现没用,在res/value/String.xml里还有一些字符串呢?
后来我的解决办法是:
先新建一个包 com.alipay.android.app.lib;
然后新建这个ResourceMap类,之后
在当前项目下的 res/value/String.xml 添加 alipay_lib项目的 String
OK 搞定! 已经成功调出支付宝快捷支付了!
3.支付后,支付宝提示 "系统繁忙,请稍后再试"
百思不得姐 怎么搞?最后谷歌除了一个结果:
Keys.java文件中 //收款支付宝账号 DEFAULT_SELLER 这个key 要用2088开头的,后来,设置成跟 合作身份者id : DEFAULT_PARTN 这个一样的值。 我之前收款的支付宝账号是我朋友的手机号!
//合作身份者id,以2088开头的16位纯数字 public static final String DEFAULT_PARTNER = "20885113110XXXX"; //收款支付宝账号 public static final String DEFAULT_SELLER = "20885113110XXXX";
OK 问题解决 付款成功!
附图:
点击上图的确定键之后:
支付宝的同步数据抓取到的是:
resultStatus={9000};memo={};result={partner="2088511311XXXXXXXX"&out_trade_no="082014455211590"&subject="香滑可口"&body="法式面包"&total_fee="0.01"¬ify_url="http%3A%2F%2Fnotify.java.jpxx.org%2Findex.jsp"&service="mobile.securitypay.pay"&_input_charset="UTF-8"&return_url="http%3A%2F%2Fm.alipay.com"&payment_type="1"&seller_id="2088511311037077"&it_b_pay="1m"&success="true"&sign_type="RSA"&sign="lTBdx8LAEJEsv+hrlmno5DIaBzMoMlYuLud9TOe88L8VRAEwQVZXUw5R1J9LNuaFZYHEyIQ/ltKHU5XAfrjvYDaT5fPS6uZIRVAVKomZcgW8j68nnnNacZlVyNkA/H7DQPKmTjiCx7RNSx1CzpeKCebzW1c6M45OvbED5k06ZHg="}
out_trade_no这个字段是支付宝生成的支付宝生成的商户订单号,也可以改成自己服务器生成的订单号,这个很重要,如果发生法律纠纷需要用这个号码去核对。这个账号会生成在用户的支付宝账单里面。用手机支付宝客户端可以看到这笔账单记录。
sign这个字段是&sign_type 这个之前的所有字符串的加密数据,这个也很重要,
把sign 和 out_trade_no取出来存到自己的服务器,作为以后发生一些问题 时,进行查询。
我这边就写了个model用来去这个返回的同步数据。
/** * Created by aa on 2014/8/20. */public class AlipayResultModel implements Serializable{ public String resultStatuscode="";//返回的代码 成功是 9000 public String resultStatus="";//成功 失败 public String partner=""; public String notify_id="";//通知校验ID public String out_trade_no="";//商户网站唯一订单号 public String subject="";//商品名称 public String body="";//商品介绍 public String total_fee=""; public String seller_id=""; public String sign_type="RSA";//签名方式 public String sign="";//sign}然后在Result类里面加了这个方法 ,来从返回的同步数据中抓取制定字段,存到这个model里面了。作为下次提交到服务器。
public AlipayResultModel getPayresultmodel() { AlipayResultModel model=new AlipayResultModel(); try { String src = mResult.replace("{", ""); src = src.replace("}", ""); src = src.replace("\"", ""); model.resultStatuscode = getContent(src, "resultStatus=", ";memo"); if (sResultStatus.containsKey(model.resultStatuscode)) { model.resultStatus = sResultStatus.get(model.resultStatuscode);//赋值 返回成功 失败原因 等 } else { model.resultStatus = "其他错误"; } String rst = getContent(src, "result=", null); JSONObject json = string2JSON(rst, "&"); try{ if(!json.isNull("body")) model.body=json.getString("body"); if(!json.isNull("out_trade_no")) model.out_trade_no=json.getString("out_trade_no"); if(!json.isNull("seller_id")) model.seller_id=json.getString("seller_id"); if(!json.isNull("sign")) model.sign=json.getString("sign"); if(!json.isNull("total_fee")) model.total_fee=json.getString("total_fee"); if(!json.isNull("sign_type")) model.sign_type=json.getString("sign_type"); if(!json.isNull("notify_id")) model.notify_id=json.getString("notify_id"); if(!json.isNull("seller_id")) model.seller_id=json.getString("seller_id"); if(!json.isNull("partner")) model.partner=json.getString("partner"); if(!json.isNull("subject")) model.subject=json.getString("subject"); } catch (Exception ex){} } catch (Exception e) { return null; } return model; }
这里采用的方式是在支付成功的界面点击确定按钮,然后才能抓取到数,将支付宝返回的数据提交到自己的服务器,后来想想不对劲。我获取到这段返回数据是在支付完成界面,但是如果已经支付完成,但是还没有点击确定键,这时手机断电,或者后台程序再KILL进程,那样的话我就抓取不到是否支付成功。而是事实上已经支付成功了。
所以后来仔细翻阅文档,叫做服务器同步数据。根据notify_url这个字段,在我提交到阿里的时候,提交了这个,这个字段要改成我们自己的服务器的字段。然后我们那几个utf8的编码是指阿里去请求你的这个notify_url的时候阿里服务器请求的编码,我们的就可以获取到这个订单号还有其他的一些东西。然后服务端就会根据订单号把这个订单的支付状态设置为已经支付。
这样的话,支付成功的时候,你点击不点击确定键,抓取不抓取这个支付状态都没问题。
安全性设计:
我有一篇博客说到客户端安全性设计的问题! 其中就讲到两点:
1.我们假如数据是裸露的,很多人都可以看到,我们的系统要设计的就算数据裸漏也要保证不容易被攻击。
2.我们把自己当成黑客来攻击自己app。
那么我来根据这两条逻辑来走一走,数据裸露的问题。
上面有一些支付宝同步数据
resultStatus={9000};memo={};result={partner="2088511311XXXXXXXX"&out_trade_no="082014455211590"&subject="香滑可口"&body="法式面包"&total_fee="0.01"¬ify_url="http%3A%2F%2Fnotify.java.jpxx.org%2Findex.jsp"&service="mobile.securitypay.pay"&_input_charset="UTF-8"&return_url="http%3A%2F%2Fm.alipay.com"&payment_type="1"&seller_id="2088511311037077"&it_b_pay="1m"&success="true"&sign_type="RSA"&sign="lTBdx8LAEJEsv+hrlmno5DIaBzMoMlYuLud9TOe88L8VRAEwQVZXUw5R1J9LNuaFZYHEyIQ/ltKHU5XAfrjvYDaT5fPS6uZIRVAVKomZcgW8j68nnnNacZlVyNkA/H7DQPKmTjiCx7RNSx1CzpeKCebzW1c6M45OvbED5k06ZHg="}
那么我就可以到我们的支付宝key,然后我就可以自己用IDE新件一个安卓项目,模拟支付宝支付的过程,然后我用抓包软件抓取这个订单的ID,已及其他信息,之后拼接info,把info里面的价格修改成0.01元,然后根据key把info生成sign,完成支付。
那么支付会不会成功呢?会的。 这是肯定的,支付宝那边验证info字符串和后面加密的sign是否一致,一致即通过,通过之后支付宝的服务器就会根据info字符串里面你拼接进来的notify_url来通知我们的自己的服务器,这笔订单支付成功。
那么问题来了 ,我究竟在这次破解过程获得了什么利益,OK!如果你看不出来的话,那我来说,我刚刚只是支付了0.01元就把这个订单给支付了,那么假如我买了一件ZARA的风衣1999元,结果我只是支付了0.01。懂了吧!
那么,为了防止破解我们应该怎样做好安全性处理呢?我把问题留在这里,如果你想到了,你写在评论里,我们交流下,反正我有我的方法,但是也不一定就是最好的。你写下你的方法,最后我再说我的方法,大家互相学习交流。
OK!今天就说到这里。
PS:
附加错误:
1.
有朋友说 支付宝登录过一个帐号之后,每次支付,就一直是那个账户,这个不能算是一个错误。
扫一扫关注我的公众号,听我跟你说说段子。
- 客户端接入支付宝过程遇到的错误(版本号:1.0)
- 安卓接入支付宝(demo遇到的问题)
- 接入支付宝时遇到的问题
- 接入支付宝SDK遇到的坑
- iOS客户端的微信支付接入
- iOS客户端的微信支付接入
- iOS客户端的微信支付接入
- iOS客户端的微信支付接入
- iOS客户端的微信支付接入
- 微信支付接入遇到的问题
- 微信支付接入遇到的问题
- 安卓接入微信支付解析,细数开发过程中遇到的坑
- IOS 支付宝集成遇到的错误
- iOS支付宝支付(Alipay)详细接入流程以及项目中遇到的问题分析
- iOS支付宝支付(Alipay)详细接入流程以及项目中遇到的问题分析
- 接入支付宝出现交易订单处理失败,请稍后再试(ALI64)的错误
- Android的支付接入(一):支付宝
- thinkphp集成支付宝支付接口遇到的错误
- 网络加载图片及轮播
- ios 牛比的iOS框架、库、教程、Xcode插件、组件列表
- android 传感器使用与开发----方向传感器
- 刚刚升职为部门经理,下属不配合工作,该怎么做?
- 提高UITableView性能的三种方法
- 客户端接入支付宝过程遇到的错误(版本号:1.0)
- 常见网络编程面试题整理
- HDFS Short-Circuit Local Reads
- OC的命名方法--转载
- Codeforces Round #262 (Div. 2) A
- QPixmap
- javascript中"=="和"==="区别
- 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文教程(精)
- 快速排序