Android反编译集成支付,android 支付宝SDK集成

http://blog.csdn.net/kroclin/article/details/40746779

一、前言

最近做的项目刚好要集成支付宝,上网找了很多资料,介绍得感觉不是很全面,所以我经过这两天的集成,顺便记录下来,学习交流。需要的朋友也可以看看。主要集成还是参照了官方给出的demo,再参照demo进行封装,现在使用起来变得方便好多。而且文章里面还提到了集成过程中遇到的一些问题,当然最后也都解决了。

二、准备工作

支付宝开放平台上面也明确了,目前仅仅支持企业用户申请,所以个人开发者就没法使用到。希望支付宝早日可以开放给个人开发者。

支付宝的集成是相对比较麻烦,其中涉及到了很多东西要弄,要生成私钥公钥等等。文档里面也有详细说到如何如何生成那些东西,不过就是文档的内容量有点多了,看起来总抓不住前后,这里我稍作整理,把android需要用到的提取出来了。

1、PID

首先说一下就是支付宝的支付是这样的,企业用户申请了支付宝之后,支付宝就会提供一个合作者id,就是所谓的pid,是2088开头的16位纯数字;

2、支付宝账户

这个就是你用于收款用的支付宝账号,要跟申请时候同一个。

以下几个要运行我附件中的“移动支付接口智能SDK版"中,\openssl\bin文件夹下面的openssl.exe生成,这个是由支付宝提供的

3、RSA私钥:genrsa -out rsa_private_key.pem 1024

运行完命令行可以看到bin文件夹下面会生成私钥

20fd026ce20c3c52d3af167f649ea57f.png

4、RSA公钥:rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

运行完命令行后可以看到生成了公钥

202dc4b740736adc0c3a43b8331457a4.png

5、PKCS8编码的私钥:pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

运行完后,将生成的东西拷贝下来放到文本文件里面就行。这后面要用到的!!包括begin跟end那两句一起存起来

590e832abad9db814aaf4bfb3e7cdc86.png

三、支付过程

需要进行再封装的主要有下面这个类,做几点说明,AliPayParamsBO是我封装的一个实体类,因为我把刚刚上面讲到的那些PID、私钥啊等等都放在服务端了,这样会比较安全,就算别人反编译了你的项目,那也看不到什么东西,支付宝官方也是这样建议的。测试的时候,可以把这个AliPayParamsBO类,装进你生成的那些参数去测试就好啦,至于OrderBO类,也是我封装的一个类,里面主要包含的是这个订单相关的一些东西,比如商品名称、商品介绍,价格等等,这些在支付过程中都是必要的。

而需要强调一点就是,产生这个支付过程中,我先是构造好需要请求的参数,注意一点就是我在createOrderInfo()方法中对参数进行构造,但是 sign、sign_type 两个参数先不要参与,因为这两个参数不需要参与签名,等前面那些参数构造好了之后,签完名再将sign、sign_type 两个参数构造进去,再进行支付。

[java]  view plain copy

importjava.io.UnsupportedEncodingException;

importjava.net.URLEncoder;

importandroid.os.Handler;

importandroid.os.Message;

importcom.alipay.android.app.sdk.AliPay;

importcom.common.ui.BaseActivity;

importcom.common.utils.CLog;

importcom.onecity.cs.bo.AliPayParamsBO;

importcom.onecity.cs.bo.OrderBO;

/**

* @author 林楷鹏

* @description 支付宝相关操作

* @create 2014-11-1下午12:11:20

*

*/

publicclassAlipayUtil {

privatestaticfinalString TAG ="PayActivity";

publicstaticfinalintRQF_PAY =1;

publicstaticfinalintRQF_LOGIN =2;

publicstaticvoidpay(finalBaseActivity activity, AliPayParamsBO aliPayBO, OrderBO orderBO,finalHandler handler){

try{

String info = createOrderInfo(orderBO, aliPayBO);

String sign = Rsa.sign(info, aliPayBO.getPrivate_key_pkcs8());

sign = URLEncoder.encode(sign, "utf-8");

info += "&sign=\""+ sign +"\"&"+ getSignType();

CLog.log("ExternalPartner","start pay");

// start the pay.

CLog.log(TAG, "info = "+ info);

finalString orderInfo = info;

newThread() {

publicvoidrun() {

AliPay alipay = newAliPay(activity, handler);

//设置为沙箱模式,不设置默认为线上环境

//alipay.setSandBox(true);

String result = alipay.pay(orderInfo);

CLog.log(TAG, "result = "+ result);

Message msg = handler.obtainMessage();

msg.what = RQF_PAY;

msg.obj = result;

handler.sendMessage(msg);

}

}.start();

} catch(Exception ex) {

ex.printStackTrace();

}

}

/**

* 封装订单信息

* @param orderBO

* @return

* @throws UnsupportedEncodingException

*/

privatestaticString createOrderInfo(OrderBO orderBO, AliPayParamsBO aliPayBO)

throwsUnsupportedEncodingException {

StringBuilder sb = newStringBuilder();

sb.append("partner=\"");

sb.append(aliPayBO.getPid());

sb.append("\"&out_trade_no=\"");

sb.append(orderBO.getOrder_sn());

sb.append("\"&subject=\"");

sb.append(orderBO.getSubject());

sb.append("\"&body=\"");

sb.append(orderBO.getBody());

sb.append("\"&total_fee=\"");

sb.append(/*orderBO.getAmount()*/"0.01");

sb.append("\"¬ify_url=\"");

// 网址需要做URL编码

sb.append(URLEncoder.encode(aliPayBO.getNotify_url(), "utf-8"));

sb.append("\"&service=\"mobile.securitypay.pay");

sb.append("\"&_input_charset=\"UTF-8");

sb.append("\"&return_url=\"");

sb.append(URLEncoder.encode("http://m.alipay.com","utf-8"));

sb.append("\"&payment_type=\"1");

sb.append("\"&seller_id=\"");

sb.append(aliPayBO.getAccount());

// 如果show_url值为空,可不传

// sb.append("\"&show_url=\"");

sb.append("\"&it_b_pay=\"1m");

sb.append("\"");

returnnewString(sb);

}

/**

* 获取sign_type参数信息,因为该参数不需要参加签名

* @return

*/

privatestaticString getSignType() {

return"sign_type=\"RSA\"";

}

}

遇到的问题:整个过程还是比较顺利的,一开始我是使用了4.0系统的手机进行测试,也能够正常使用。但是跑给同事手机之后,问题出现了,居然出现了。。点击支付的时候始终唤不起支付页面,还报了 failure calling remote service 异常,然后就挺纳闷,查了代码发现好像没啥问题。

马上去打印log,看到了如下问题:

a53740200f1a39120d03068ab6668f85.png

76c72797728a6419903fa8de305ab9a6.png

看了以上异常信息之后我的第一反应就是难道我的私钥弄错了,但想想4.0还是没问题的啊。后来就追查到了代码中,就在Rsa类中的sign方法,这是支付宝给出的类,我就在异常中将异常信息打印出来,果真

0435f693d5f114aea124456f293dfe3e.png

还是编码问题。

[java]  view plain copy

publicstaticString sign(String content, String privateKey) {

String charset = "UTF-8";

try{

PKCS8EncodedKeySpec priPKCS8 = newPKCS8EncodedKeySpec(

Base64.decode(privateKey));

KeyFactory keyf = KeyFactory.getInstance("RSA");

PrivateKey priKey = keyf.generatePrivate(priPKCS8);

java.security.Signature signature = java.security.Signature

.getInstance(SIGN_ALGORITHMS);

signature.initSign(priKey);

signature.update(content.getBytes(charset));

byte[] signed = signature.sign();

returnBase64.encode(signed);

} catch(Exception e) {

e.printStackTrace();

System.out.println("Exception="+e.getMessage());

}

returnnull;

}

然后我就突然想到了上面生成的  “PKCS8编码的私钥”,然后将刚刚上面那个AlipayUtil类的pay方法里面的

[java]  view plain copy

String sign = Rsa.sign(info, aliPayBO.getPrivate_key_pkcs8());

签名时用的就是

PKCS8编码的私钥”(原本出问题是用到RSA私钥),代码中改过来了。这次就行了啦,无论4.0以下还是以上通杀。界面如下:

f6850b803b6feb6577148ead05791db7.png

好啦,客户端的集成大概就是这样,其他相关的类是按照支付宝demo里面的,就不要展示出来了,需要的到

代码下载

里面去下载就ok啦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值