Android 集成 支付宝

一.到支付宝官网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=”[email protected]”&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= “[email protected]”&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 [email protected]"&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提供的接口。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。