支付宝之移动支付的简单集成

来源:互联网 发布:b站下架 知乎 编辑:程序博客网 时间:2024/05/03 11:59

支付宝集成参考:

https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.zMbBFv&treeId=193&articleId=105297&docType=1
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.SiQGSk&treeId=59&articleId=103563&docType=1

参照上面两个文档完成准备工作之后,得到以下数据

  /** 支付宝支付业务:入参app_id */    public static final String APPID = "";/** 商户私钥,pkcs8格式 */    public static final String RSA_PRIVATE =“” //商户合作id    public static final String PARTNER = "";    // 商户收款的支付宝账号    public static final String SELLER = "";    // 支付宝公钥    public static final String RSA_PUBLIC = “”

现在就来看看代码的集成。

1、将alipay-sdk-common/alipaySdk-xxxxxxxx.jar包放入商户应用工程的libs目录下

2、进入商户应用工程的Java Build Path,将libs目录下的alipaySDK-xxxxxxxx.jar导入

3、选中Order and Export,勾选alipaySDK-xxxxxxxx.jar

4、修改Manifest

在商户应用工程的AndroidManifest.xml文件里面添加声明:

<activity            android:name="com.alipay.sdk.app.H5PayActivity"            android:configChanges="orientation|keyboardHidden|navigation"            android:exported="false"            android:screenOrientation="behind" ></activity><activity            android:name="com.alipay.sdk.auth.AuthActivity"            android:configChanges="orientation|keyboardHidden|navigation"            android:exported="false"            android:screenOrientation="behind" > </activity>

和权限声明:

<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

添加混淆规则

5、在商户应用工程的proguard-project.txt里添加以下相关规则:

-libraryjars libs/alipaySDK-20150602.jar-keep class com.alipay.android.app.IAlixPay{*;}-keep class com.alipay.android.app.IAlixPay$Stub{*;}-keep class com.alipay.android.app.IRemoteServiceCallback{*;}-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}-keep class com.alipay.sdk.app.PayTask{ public *;}-keep class com.alipay.sdk.app.AuthTask{ public *;}

主要方法:调用支付宝SDK进行支付

/** * 支付宝 * call alipay sdk pay. 调用SDK支付 * */public void payOfAliMethod() {    /**     * call alipay sdk pay. 调用SDK支付     *     */        if (TextUtils.isEmpty(PARTNER) || TextUtils.isEmpty(RSA_PRIVATE) || TextUtils.isEmpty(SELLER)) {            new AlertDialog.Builder(this).setTitle("警告").setMessage("需要配置PARTNER | RSA_PRIVATE| SELLER")                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {                        public void onClick(DialogInterface dialoginterface, int i) {                            //                            finish();                        }                    }).show();            return;        }        String orderInfo = getOrderInfo(shangPin, dingdanHao, "0.01");        Log.i(TAG,"---"+orderInfo);        /**         * 特别注意,这里的签名逻辑需要放在服务端,切勿将私钥泄露在代码中!         */        String sign = sign(orderInfo);        try {        /*  仅需对sign 做URL编码*/            sign = URLEncoder.encode(sign, "UTF-8");        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }    LogHelper.i(TAG,"---"+sign);        /**         * 完整的符合支付宝参数规范的订单信息         */        final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();        Log.i(TAG,"----"+payInfo);        Runnable payRunnable = new Runnable() {            @Override            public void run() {                // 构造PayTask 对象                PayTask alipay = new PayTask(PayOptActivity.this);                // 调用支付接口,获取支付结果                String result = alipay.pay(payInfo, true);                Message msg = new Message();                msg.what = SDK_PAY_FLAG;                msg.obj = result;                mHandler.sendMessage(msg);            }        };        // 必须异步调用        Thread payThread = new Thread(payRunnable);        payThread.start();    }

创建订单信息

 /** * create the order info. 创建订单信息 * */private String getOrderInfo(String subject, String body, String price) {    // 签约合作者身份ID    String 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://www.xiaohoutai.com.cn:8888/XHT/pay/alipay/notify" + "\"";    // 服务接口名称, 固定值    orderInfo += "&service=\"mobile.securitypay.pay\"";    // 支付类型, 固定值    orderInfo += "&payment_type=\"1\"";    // 参数编码, 固定值    orderInfo += "&_input_charset=\"utf-8\"";    // 设置未付款交易的超时时间    // 默认30分钟,一旦超时,该笔交易就会自动被关闭。    // 取值范围:1m~15d。    // m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。    // 该参数数值不接受小数点,如1.5h,可转换为90m。    orderInfo += "&it_b_pay=\"30m\"";    // extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付    // orderInfo += "&extern_token=" + "\"" + extern_token + "\"";    // 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空    orderInfo += "&return_url=\"m.alipay.com\"";    return orderInfo;}

生成商户订单号,该值在商户端应保持唯一(可自定义格式规范)

 private 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);    return key;}

对订单信息进行签名

/** * sign the order info. 对订单信息进行签名 * * @param content *            待签名订单信息 */private String sign(String content) {    return SignUtils.sign(content, RSA_PRIVATE,"utf-8");}/** * get the sign type we use. 获取签名方式 * */private String getSignType() {    return "sign_type=\"RSA\"";}

SignUtils.sign签名的方法:

public static String sign(String content, String privateKey, String input_charset){    try    {        PKCS8EncodedKeySpec priPKCS8    = new PKCS8EncodedKeySpec( Base64.decode(privateKey) );        KeyFactory keyf                 = KeyFactory.getInstance("RSA");        PrivateKey priKey               = keyf.generatePrivate(priPKCS8);        java.security.Signature signature = java.security.Signature                .getInstance(SIGN_ALGORITHMS);        signature.initSign(priKey);        signature.update( content.getBytes(input_charset) );        byte[] signed = signature.sign();        return Base64.encode(signed);    }    catch (Exception e)    {        e.printStackTrace();    }    return null;}

PayResult的代码:

public class PayResult {    private String resultStatus;    private String result;    private String memo;    public PayResult(String rawResult) {    if (TextUtils.isEmpty(rawResult))        return;    String[] resultParams = rawResult.split(";");    for (String resultParam : resultParams) {        if (resultParam.startsWith("resultStatus")) {            resultStatus = gatValue(resultParam, "resultStatus");        }        if (resultParam.startsWith("result")) {            result = gatValue(resultParam, "result");        }        if (resultParam.startsWith("memo")) {            memo = gatValue(resultParam, "memo");        }    }}@Overridepublic String toString() {    return "resultStatus={" + resultStatus + "};memo={" + memo            + "};result={" + result + "}";}private String gatValue(String content, String key) {    String prefix = key + "={";    return content.substring(content.indexOf(prefix) + prefix.length(),            content.lastIndexOf("}"));}/** * @return the resultStatus */public String getResultStatus() {    return resultStatus;}/** * @return the memo */public String getMemo() {    return memo;}/** * @return the result */public String getResult() {    return result;}

}

至此,支付宝集成就已经完成,可以开始使用了。

0 0
原创粉丝点击