Android 集成 支付宝

时间:2022-09-24 17:43:52

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

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

支付细节的实现,主要通过支付宝提供的一个支付安全服务安装包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);

}
}

上面我将一些pay 方法需要的一些参数封装到bean 当中,实际开发中这个bean中的数据最好去从服务器获取,保证与支付宝平台数据的同步。
我们现在来看一下 pay()需要的参数:
主要包含商户的订单信息,key=”value”形式,以&连接。 支付参数示例如下: partner=”2088101568358171”&seller_id=”xxx@alipay.com”&out_trade_no=”0819145 412-6177”&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-8”&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-6177”&subject=”测试”&body=”测试 测 试 “&total_fee=”0.01”&notify_url=”http://notify.msp.hk/notify.htm”&service=” mobile.securitypay.pay”&payment_type=”1”&_input_charset=”utf-8”&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 保留参数,一般无内容。 可空
*/

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-61
* 77"&subject="《暗黑破坏 神 3:凯恩之书》"&body=" 暴雪唯一官方授权中文版! 玩家必藏!附赠暗黑精致手
* 绘地图!绝不仅仅是一本暗 黑的故事或画册,而是一 个栩栩如生的游戏再现。 是游戏玩家珍藏的首选。
* "&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-8"&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. 支付宝服务器通知。商户需要提供一个http协议的接口,包含在参数里传递给安全支付,即notify_url。支付宝服务器在支付完成后,会用POST方法调用notufy_url,以xml为数据格式传输支付结果,然后支付宝回传的参数修改订单状态等操作。需要注意的是,商户服务器收到支付宝发的通知之后,需要返回一个纯字符串“success”,不然支付宝的服务器会持续调用七次回调url提供的接口。