美文网首页
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