客户端接入支付宝过程遇到的错误(版本号: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"&notify_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"&notify_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="}

我们的apk包里面的dex文件被反编译,OK安卓初学者就能做到反编译,

那么我就可以到我们的支付宝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.

有朋友说 支付宝登录过一个帐号之后,每次支付,就一直是那个账户,这个不能算是一个错误。

支付宝 的话你登录过一次 ,他就绑定帐号 。
所以 ,你要手动去清除设备授权。 这个是我们使用代码控制不了的。


扫一扫关注我的公众号,听我跟你说说段子。



0 0
原创粉丝点击