程序员人生 网站导航

Android 集成 支付宝

栏目:综合技术时间:2015-04-24 08:31:10

1.到支付宝官网https://b.alipay.com/order/techService.htm?channel=psl下载(快捷支付(无线))开发包。将alipay-sdk-common文件夹下的alipaysdk.jar ,alipaysecsdk.jar,alipaysecsdk.jar 拷贝到工程的libs下。

2.支付宝集成
在技术集成之前,商户需要在https://ms.alipay.com进行注册,并签约安全支付服务。签约成功后可获得支付宝分配的合作商户ID(PartnerID),账户ID(SellerID),调用接口时使用。

支付细节的实现,主要通过支付宝提供的1个支付安全服务安装包alipay_plugin_20120428msp.apk,首次使用,首先检查是不是安装此插件,没有会提示安装。具体的支付细节,在这个插件内完成。大部份的支付平台也都是采取的这类方式。

调用支付宝的接口进行支付,主要有以下几个步骤

  1. 将商户ID,收款帐号,外部定单号,商品名称,商品介绍,价格,通知地址封装成定单信息

  2. 对定单信息进行签名

  3. 将定单信息,签名,签名方式封装成要求参数

  4. 调用pay方法。
    下面我们就从点击支付按钮开始:

ResultSingleBean rb6 = (ResultSingleBean) VolleyResponseHelper .jsonToBean(response, 43); if (rb6.getRetCode() == 0) { final PayDataBean bean = (PayDataBean) rb6.getRetObj(); new Thread() { public void run() { PayTask alipay = new PayTask(OrderDetailActivity.this); // 设置为沙箱模式,不设置默许为线上环境 // alipay.setSandBox(true); String result = alipay.pay(bean.getPayData()); Message msg = new Message(); msg.what = RQF_PAY; msg.obj = result; CommonUtils.logWrite("pay result1111111111",result); mHandler.sendMessage(msg); } }.start(); } else { CustomToast.showToast(rb6.getRetMessage(), OrderDetailActivity.this); } }

上面我将1些pay 方法需要的1些参数封装到bean 当中,实际开发中这个bean中的数据最好去从服务器获得,保证与支付宝平台数据的同步。
我们现在来看1下 pay()需要的参数:
主要包括商户的定单信息,key=”value”情势,以&连接。 支付参数示例以下: partner=”2088101568358171”&seller_id=”xxx@alipay.com”&out_trade_no=”0819145 412⑹177”&subject=”商品名称”&body=”商品详情 “&total_fee=”0.01总金额”&notify_url=”http://notify.msp.hk/notify.htm用于通知服务器进行相干操作”&service=”mobile.securi typay.pay”&payment_type=”1”&_input_charset=”utf⑻”&it_b_pay=”30m”&sign=”lBBK %2F0w5LOajrMrji7DUgEqNjIhQbidR13GovA5r3TgIbNqv231yC1NksLdw%2Ba3JnfH XoXuet6XNNHtn7VE%2BeCoRO1O%2BR1KugLrQEZMtG5jmJIe2pbjm%2F3kb%2F uGkpG%2BwYQYI51%2BhA3YBbvZHVQBYveBqK%2Bh8mUyb7GM1HxWs9k4%3D “&sign_type=”RSA”

若调用成功返回结果示例以下:
resultStatus={9000};memo={};result={partner=”2088101568358171”&seller_id= “xxx@alipay.com”&out_trade_no=”0819145412⑹177”&subject=”测试”&body=”测试 测 试 “&total_fee=”0.01”&notify_url=”http://notify.msp.hk/notify.htm”&service=” mobile.securitypay.pay”&payment_type=”1”&_input_charset=”utf⑻”&it_b_pay= “30m”&success=”true”&sign_type=”RSA”&sign=”hkFZr+zE9499nuqDNLZEF7W75RFFPs ly876QuRSeN8WMaUgcdR00IKy5ZyBJ4eldhoJ/2zghqrD4E2G2mNjs3aE+HCLiBXrPDNdLKCZ gSOIqmv46TfPTEqopYfhs+o5fZzXxt34fwdrzN4mX6S13cr3UwmEV4L3Ffir/02RBVtU=”}

具体参数请参考刚刚下载的sdk所附文档。

问了方便 我们将返回结果进行处理:

public class AliPayResult { static String str = "resultStatus={9000};memo={};result={partner="2088201363678709"&seller_id="2088201363678709"&out_trade_no="7078994"&subject="速普商城定单No:7078994"&body="0105041067 MOONY 尤妮佳 原装进口婴儿纸尿裤 L54片 *1"&total_fee="0.01"&notify_url="http%3a%2f%2fwww.supuy.com%2fbank%2fAlipay_MobileNotify_V2.aspx"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="60m"&success="true"&sign_type="RSA"&sign="WxHHLaeqXcoyViBJyQV1a2+luhry9umGDLnjSX4HrcH6Q6Un75KJwIT1QAWnHcXrVOPcAT9xD8Sk923SjUkQRA0VDh29IPNA26FV+aaxV5yMyPP/kBF+oKiQy01LhQswTZDTF7k21SR2PNEdjXFnHzQJvzjthILbgJp7aEASwLM="}"; public static void main(String[] args) { AliPayResult result = new AliPayResult(str); result.getResult(); } private static final Map<String, String> sResultStatus; private String mResult; String resultStatus = null; String memo = null; String result = null; boolean isSignOk = false; public AliPayResult(String result) { this.mResult = result; } static { sResultStatus = new HashMap<String, String>(); sResultStatus.put("{9000}", "支付成功"); sResultStatus.put("{4000}", "系统异常"); sResultStatus.put("{4001}", "定单参数毛病"); sResultStatus.put("{6001}", "您已取消了本次定单的支付"); sResultStatus.put("{6002}", "网络连接异常"); } /** * 获得支付宝返回的支付状态信息 * * @return */ public String getResult() { AliPayResultBean bean = Json2Bean(string2JSON(mResult, ";")); return sResultStatus.get(bean.getResultStatus()); } private AliPayResultBean Json2Bean(JSONObject json) { Gson gson = new Gson(); return gson.fromJson(json.toString(), AliPayResultBean.class); } public JSONObject string2JSON(String src, String split) { JSONObject json = new JSONObject(); try { String[] arr = src.split(split); for (int i = 0; i < arr.length; i++) { String[] arrKey = arr[i].split("="); json.put(arrKey[0], arr[i].substring(arrKey[0].length() + 1)); } } catch (Exception e) { e.printStackTrace(); } return json; } private String getContent(String src, String startTag, String endTag) { String content = src; int start = src.indexOf(startTag); start += startTag.length(); try { if (endTag != null) { int end = src.indexOf(endTag); content = src.substring(start, end); } else { content = src.substring(start); } } catch (Exception e) { e.printStackTrace(); } return content; } }

返回结果封装:

public class AliPayResultBean extends BaseBean { /** * 状态代码 String 本次操作的状态返回值,标 识本次调用的结果,参见 “11.2 客户端毛病码”。 不可空 9000 */ private String resultStatus; /** * 提示信息 String 保存参数,1般无内容。 可空 */ private String memo; /** * 本次操作 返回的结 果数据 本次操作返回的结果数据。 其中: &success="true"&sign_typ * e="RSA"&sign="xxx"之前 的部份为商户的原始数据。 success用来标识本次支付 结果。 sign="xxx"为支付宝对本次 * 支付结果的签名,商户可以 使用签约时支付宝提供的 公钥进行验证。 不可空 partner="2088101568358 * 171"&seller_id="alipay-te st09@alipay.com"&out_tr ade_no="0819145412⑹1 * 77"&subject="《暗黑破坏 神 3:凯恩之书》"&body=" 暴雪唯1官方授权中文版! 玩家必藏!附赠暗黑精致手 * 绘地图!绝不单单是1本暗 黑的故事或画册,而是1 个栩栩如生的游戏再现。 是游戏玩家收藏的首选。 * "&total_fee="0.01"&notify _url="http%3A%2F%2Fn otify.msp.hk%2Fnotify.ht * m"&service="mobile.secu ritypay.pay"&payment_ty pe="1"&_input_charset=" * utf⑻"&it_b_pay="30m"&s how_url="m.alipay.com"& success="true"&sign_typ * e="RSA"&sign="hkFZr+z E9499nuqDNLZEF7W75 RFFPsly876QuRSeN8W * MaUgcdR00IKy5ZyBJ4el dhoJ/2zghqrD4E2G2mNj s3aE+HCLiBXrPDNdLKC * ZgSOIqmv46TfPTEqopYf hs+o5fZzXxt34fwdrzN4m X6S13cr3UwmEV4L3Ffir * /02RBVtU=" */ private String result; public String getResultStatus() { return resultStatus; } public void setResultStatus(String resultStatus) { this.resultStatus = resultStatus; } public String getMemo() { return memo; } public void setMemo(String memo) { this.memo = memo; } public String getResult() { return result; } public void setResult(String result) { this.result = result; } }

注意:
调用了支付服务以后,有两种方式返回交易结果:

  1. 支付结果作为接口返回的字符串返回。返回的参数包括在result字符串中,具体再进行解析。

  2. 支付宝服务器通知。商户需要提供1个http协议的接口,包括在参数里传递给安全支付,即notify_url。支付宝服务器在支付完成后,会用POST方法调用notufy_url,以xml为数据格式传输支付结果,然后支付宝回传的参数修改定单状态等操作。需要注意的是,商户服务器收到支付宝发的通知以后,需要返回1个纯字符串“success”,不然支付宝的服务器会延续调用7次回调url提供的接口。

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐