KrocLin android学习笔记

一、前言

最近做的项目刚好要集成支付宝,上网找了很多资料,介绍得感觉不是很全面,所以我经过这两天的集成,顺便记录下来,学习交流。需要的朋友也可以看看。主要集成还是参照了官方给出的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文件夹下面会生成私钥

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

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

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

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

三、支付过程

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

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

import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import android.os.Handler;import android.os.Message;import com.alipay.android.app.sdk.AliPay;import com.common.ui.BaseActivity;import com.common.utils.CLog;import com.onecity.cs.bo.AliPayParamsBO;import com.onecity.cs.bo.OrderBO;/** * @author 林楷鹏 * @description 支付宝相关操作 * @create 2014-11-1下午12:11:20 * */public class AlipayUtil {private static final String TAG = "PayActivity";public static final int RQF_PAY = 1;public static final int RQF_LOGIN = 2;public static void pay(final BaseActivity activity, AliPayParamsBO aliPayBO, OrderBO orderBO, final Handler 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);final String orderInfo = info;new Thread() {public void run() {AliPay alipay = new AliPay(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 */private static String createOrderInfo(OrderBO orderBO, AliPayParamsBO aliPayBO)throws UnsupportedEncodingException {StringBuilder sb = new StringBuilder();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("", "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("\&;");return new String(sb);}/** * 获取sign_type参数信息,因为该参数不需要参加签名 * @return */private static String getSignType() {return "sign_type=\&;RSA\&;";}}

failure calling remote service 异常,然后就挺纳闷,查了代码发现好像没啥问题。

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

如果你在以的话,别人就会知道你害怕被说,他们就会加倍地说你,

KrocLin android学习笔记

相关文章:

你感兴趣的文章:

标签云: