美文网首页
Android之支付宝支付集成环境

Android之支付宝支付集成环境

作者: 破荒之恋 | 来源:发表于2016-12-26 11:43 被阅读1040次

支付宝集成参考:

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");
        }
    }
}

@Override
public 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;
}

}

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

相关文章

网友评论

      本文标题:Android之支付宝支付集成环境

      本文链接:https://www.haomeiwen.com/subject/tgdjvttx.html