关于Android在线支付Alipay(支付宝)开发的经验分享

在近期,公司需要开发一个关于在线支付的模块,所以需要用到第三方支付平台

转载请注明出处:

经过一周多的时间对这两种支付平台的研究,,完成功能后将经验分享给大家,希望能帮助到有需求的朋友。

首先是支付宝的开发资料方面: 接口申请url https://b.alipay.com/order/productDetail.htm?productId=2014110308141993

API开发文档

申请流程 注册支付宝账号——进行实名认证——提交审核资料——审核通过

备注:申请通过后会获得:合作者身份ID(PID),该ID在项目配置中需要用到

开发流程: 第一步: 下载API开发文档后,即可获取官方Demo,该Demo中需要将审核通过后获取的PID替换,并且输入支付宝收款账户即可。这里非常简单,就不过多叙述。 第二步: 官方Api开发文档中,存在一个openssl的文件夹,该文件夹主要是用于生成支付宝所需要用到的公钥以及私钥。打开该文件夹可以看到详细的生成方式,根据提示生成公钥及私钥,请注意,密钥需要经过pkcs8二次加密。 第三步: 将生成的公钥和私钥配置到Demo中。 第四步(可省略): 为了方便后期维护,建议将支付宝相关的方法及配置项抽取出来做为单独的一个类,后期需要使用直接调用即可。代码如下:

package com.alipay.pay;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.text.DecimalFormat;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Locale;import java.util.Random;import android.app.Activity;import android.os.Handler;import android.os.Message;import android.support.v4.app.FragmentActivity;import android.view.View;import android.widget.Toast;import com.alipay.sdk.app.PayTask;{String PARTNER = “******”;String SELLER = “***@alipay.com”;String RSA_PRIVATE = “*****”;String RSA_PUBLIC = “******”;SDK_PAY_FLAG = 1;SDK_CHECK_FLAG = 2;private Handler mHandler;private Activity activity;private String orderNo;public Alipay(Handler handler, Activity activity) {mHandler = handler;this.activity = activity;}/*** call alipay sdk pay. 调用SDK支付**/(PayInfo payinfo) {// 订单DecimalFormat df = new DecimalFormat(“0.00″);String orderInfo = getOrderInfo(payinfo.getName(), payinfo.getDesc()+ ” “, df.format(payinfo.getPrice() * payinfo.getRate()));// 对订单做RSA 签名String sign = sign(orderInfo);try {// 仅需对sign 做URL编码sign = URLEncoder.encode(sign, “UTF-8”);} catch (UnsupportedEncodingException e) {e.printStackTrace();}// 完整的符合支付宝参数规范的订单信息final String payInfo = orderInfo + “&sign=\”” + sign + “\”&”+ getSignType();Runnable payRunnable = new Runnable() {() {// 构造PayTask 对象PayTask alipay = new PayTask(activity);// 调用支付接口,获取支付结果String result = alipay.pay(payInfo);Message msg = new Message();msg.what = SDK_PAY_FLAG;msg.obj = result;mHandler.sendMessage(msg);}};// 必须异步调用Thread payThread = new Thread(payRunnable);payThread.start();}/*** check whether the device has authentication alipay account.* 查询终端设备是否存在支付宝认证账户**/(View v) {Runnable checkRunnable = new Runnable() {() {// 构造PayTask 对象PayTask payTask = new PayTask(activity);// 调用查询接口,获取查询结果boolean isExist = payTask.checkAccountIfExist();Message msg = new Message();msg.what = SDK_CHECK_FLAG;msg.obj = isExist;mHandler.sendMessage(msg);}};Thread checkThread = new Thread(checkRunnable);checkThread.start();}/*** get the sdk version. 获取SDK版本号**/() {PayTask payTask = new PayTask(activity);String version = payTask.getVersion();Toast.makeText(activity, version, Toast.LENGTH_SHORT).show();}/*** create the order info. 创建订单信息**/public String getOrderInfo(String subject, String body, String price) {// 签约合作者身份IDString orderInfo = “partner=” + “\”” + PARTNER + “\””;// 签约卖家支付宝账号orderInfo += “&seller_id=” + “\”” + SELLER + “\””;// 商户网站唯一订单号orderInfo += “&out_trade_no=” + “\”” + getOutTradeNo() + “\””;// 商品名称orderInfo += “&subject=” + “\”” + subject + “\””;// 商品详情orderInfo += “&body=” + “\”” + body + “\””;// 商品金额orderInfo += “&total_fee=” + “\”” + price + “\””;// 服务器异步通知页面路径orderInfo += “&notify_url=” + “\”” + “http://notify.msp.hk/notify.htm”+ “\””;// 服务接口名称, 固定值orderInfo += “&service=\”mobile.securitypay.pay\””;// 支付类型, 固定值orderInfo += “&payment_type=\”1\””;// 参数编码, 固定值orderInfo += “&_input_charset=\”utf-8\””;orderInfo += “&it_b_pay=\”30m\””;orderInfo += “&return_url=\”m.alipay.com\””;orderInfo;}/*** get the out_trade_no for an order. 生成商户订单号,该值在商户端应保持唯一(可自定义格式规范)**/public String getOutTradeNo() {SimpleDateFormat format = new SimpleDateFormat(“MMddHHmmss”,Locale.getDefault());Date date = new Date();String key = format.format(date);Random r = new Random();key = key + r.nextInt();key = key.substring(0, 15);String md5 = Constants.MD5(key);this.orderNo = md5;return md5;}/*** 获取已经生产的订单编号** @return*/public String getOrderNo() {return this.orderNo;}/*** sign the order info. 对订单信息进行签名** @param content*待签名订单信息*/public String sign(String content) {return SignUtils.sign(content, RSA_PRIVATE);}/*** get the sign type we use. 获取签名方式**/public String getSignType() {return “sign_type=\”RSA\””;}}

从上面代码可以看出,程序的主要运行流程是:通过开启一个子线程去调用支付宝的支付功能,获取到支付结果后,通过Handler通知UI线程,根据支付结果去显示不同的。

到这里基本上整个开发流程已经大致完成了,具体细节根据需求去修改即可。官方建议支付完成后,将获取到的支付结果上传到自己的服务器,通过官方提供的API进行验证,建议添加该流程。

如果有疑问,可以通过QQ381959281联系作者进行交流

没有了爱的语言,所有的文字都是乏味的

关于Android在线支付Alipay(支付宝)开发的经验分享

相关文章:

你感兴趣的文章:

标签云: