首页 > 代码库 > 支付宝支付总结

支付宝支付总结

SDK接入总流程:


检查是否有支付宝钱包,如果有则直接调取,没有安装快捷支付,安装后再,以后直接调取快捷支付,而不是支付宝钱包;


1:前期配置准备工作(支付宝的资料没有放在官方网站里面,而是在支付宝开发文档论坛中,自己去查找获取)
RSA密钥使用逻辑:
商户在使用RSA签名方式的支付宝接口时,真正会用到的密钥是商户私钥与支付
宝公钥。商户上传公钥给支付宝,支付宝把公钥给商户,是公钥互换的操作。这就
使得商户使用自己的私钥做签名时,支付宝端会根据商户上传的公钥做验证签名。
商户使用支付宝公钥做验证签名时,同理,也是因为支付宝用支付宝私钥做了签名。
(1)获取公钥和私钥:
RSA密钥生成命令
生成RSA私钥
openssl>genrsa -out rsa_private_key_samy.pem 1024
生成RSA公钥
openssl>rsa -in rsa_private_key_samy.pem -pubout -out rsa_public_key_samy.pem
将RSA私钥转换成PKCS8格式
openssl>pkcs8 -topk8 -inform PEM -in rsa_private_key_samy.pem -outform PEM -nocrypt(ps:这个在客户端本地用必须配置用PKCS8格式的,服务器端直接存放RSA公钥和私钥就可以啦)




配置网站后台端:

(2):把配置好的公私钥放入代码中集成:
/**
 * @description
 *               请参考 Android平台安全支付服务(msp)应用开发接口(4.2 RSA算法签名)部分,并使用压缩包中的openssl RSA密钥生成工具,生成一套RSA公私钥。
 *               这里签名时,只需要使用生成的RSA私钥。
 *               Note: 为安全起见,使用RSA私钥进行签名的操作过程,应该尽量放到商家服务器端去进行。
 * @author samy
 * @date 2014年10月19日 下午12:00:55
 */
public final class Keys {
    // 合作身份者id,以2088开头的16位纯数字
    public static final String DEFAULT_PARTNER = "******411130864349;
    // 收款支付宝账号
    public static final String DEFAULT_SELLER = "2356904015@qq.com";
    // 商户私钥,自助生成
    public static final String PRIVATE = "*****MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAOXBQIVlU3ji6upHs6Qmh+upBmK2kJ9j8UViV07jhql9SBJnnUg28evTKop02vGrtkd2P0pxxbyME6Pp3klFblxM6fzicg3Vx1hVZAxzTB2mE0hSjtQ5gNzPs0DHTCFFcfooXkK8TqpncEWamMJ4ISd9gi+PPhmDIgc7Y7q8yBuxAgMBAAECgYAnajbSa6adR3h7hp932rBYql+REbbP0Upz18IYo4nXi8mQdrwRxnNMPKbAp/ljmkykB9IlyEze4rz/0sAym7mpwr3D4yi3ZSvA7TG7h4d+LcmCvgRNjl2UUj4719aBNN56xDN+740VI6pFNFObt/A3itg9XswctA/t4ANckNnq0QJBAPlVvxcFtjoTOR6hL7OLRjmnEMcG2tyHsydLxGcyFndAOrLhaHnk24LM/Oi81C/uEV9R7oEDOd0RiaB29fpoP3UCQQDr5YPWBSj0o4VE3Qfv7vrHTcMFNiY/9ioMiGitjnClWkN2WNPn1b5kDEFfQTt1fXD9kH8xfUI81MRf8ibegb/NAkB3hZssthg8jqp6/FmZf9ISIPvx7F9OB97hn3hu35vVXnzE8zjZ9dMkSI+UIbC1qTG6t9PVFG7Qgm+u9FfFyeNhAkAKO7OjZifnrOxMF3aPrwNMABCUukugfLJIRuabmNFEKw1AJgxTQ092EZ4IXtEQgLeVGF6cK/3im6xFKUEMZ/6FAkBGzmn/jabnMfpvi/sCSGudlKrDb778tcxUAbQZX3zwUn1LoZBAc0k6fqxtPHZIlbGLuvEGi1Yi1kRxqGbDMe32************************";
    public static final String PUBLIC = "*******MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89L6BkRAFljhNhgPdyPuBV64bfQNN1PjbCzkIM6qRdKBoLPXmKKMiFYnkd6rAoprih3/PrQEB/VsW8OoM8fxn67UDYuyBTqA23MML9q1+ilIZwBC2AQ2UBVOrFXfFl75p6/B5KsiNG9zpgmLCUYuLkxpLQIDAQAB*******************";
}  

2:代码整合:
(1):
        <!-- 支付部分 -->
          <activity
            android:name="com.unionpay.uppay.PayActivity"
            android:configChanges="orientation|keyboardHidden"
            android:excludeFromRecents="true"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustResize" >
        </activity>
        <activity
            android:name="com.alipay.android.app.sdk.WapPayActivity"
            android:screenOrientation="portrait" >
        </activity> 
 
ResourceMap 文件:这个文件必须放在package com.alipay.android.app.lib;否则alipay.jar会反射找不到文件配置和支付宝加载的界面;
 

 
(2):
  Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            Result result = new Result((String) msg.obj);
            switch (msg.what) {
                case RQF_LOGIN:
                case RQF_PAY:
                    Toast.makeText(ExternalPartnerAct.this, result.parseResult(), Toast.LENGTH_SHORT).show();
                    break;
            }
        };
    };   

    /**
     * @description:直接调取支付宝
     * @author samy
     * @date 2014年10月16日 下午7:16:20
     */
    private void payByZFBLocal() {
    final String orderInfo = Result.getNewOrderInfo(orderIdshopItemBean.merchantNametempNeedPrice >= 0 ? tempNeedPrice + "" : (-tempNeedPrice) + "");
        new Thread() {
            public void run() {
                AliPay alipay = new AliPay(atymHandler);
                // 设置为沙箱模式,不设置默认为线上环境;从这里开始跳转到支付宝界面;运行完支付pay()后回调;
                // alipay.setSandBox(true);
                String result = alipay.pay(orderInfo);
                Message msg = new Message();
                msg.what = RQF_PAY;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        }.start();
    }
  
    /**
     * @description:封装起来有多处用到;
     * @author samy
     * @date 2014年10月19日 下午12:10:45
     */
    public static String getNewOrderInfo(String out_trade_no, String subject, String total_fee) {
        StringBuilder sb = new StringBuilder();
        sb.append("partner=\"");// 合作者身份ID
        sb.append(Keys.DEFAULT_PARTNER);
        sb.append("\"&out_trade_no=\"");// 商户网站唯一订单号
        sb.append(out_trade_no);
        sb.append("\"&subject=\"");// 商品名称
        sb.append(subject);
        // sb.append("\"&body=\"");// 商品详情
        // sb.append("充100返5元");
        sb.append("\"&total_fee=\"");// 总金额
        sb.append(total_fee);
        sb.append("\"?ify_url=\"");// 网址需要做URL编码; 异步通知;服务器异步通知页面路径;
        // sb.append(URLEncoder.encode("http://notify.java.jpxx.org/index.jsp"));
        sb.append(URLEncoder.encode("http://waimai.365sji.com/notify_url_client.jsp"));
        sb.append("\"&service=\"mobile.securitypay.pay");// 接口名称 ,固定值mobile.securitypay.pay
        sb.append("\"&_input_charset=\"UTF-8");// 参数编码字符集
        // sb.append("\"&return_url=\"");
        // sb.append(URLEncoder.encode("http://m.alipay.com"));
        sb.append("\"&payment_type=\"1");// 支付类型;支付类型。默认值为:1(商品购买)
        sb.append("\"&seller_id=\"");// 卖家支付宝账号
        sb.append(Keys.DEFAULT_SELLER);
        // 如果show_url值为空,可不传
        // sb.append("\"&show_url=\"");
        sb.append("\"&it_b_pay=\"1m");// 支付超时 时间;
        sb.append("\"");
        String sign = Rsa.sign(sb.toString(), Keys.PRIVATE);
        sign = URLEncoder.encode(sign);
        StringBuffer buffer = new StringBuffer(sb);
        buffer.append("&sign=\"");
        buffer.append(sign);
        buffer.append("\"&sign_type=\"RSA\"");// 签名;签名方式,签名类型,目前仅支持RSA
        return new String(buffer);
    }

ps:





参照部分:
 @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        try {
            String info = getNewOrderInfo(position);
            String sign = Rsa.sign(info, Keys.PRIVATE);
            sign = URLEncoder.encode(sign);
            info += "&sign=\"" + sign + "\"&" + getSignType();// 签名;签名方式,签名类型,目前仅支持RSA
            Log.i("ExternalPartner""start pay");
            Log.i("samy""info = " + info);
            final String orderInfo = info;
            new Thread() {
                public void run() {
                    AliPay alipay = new AliPay(ExternalPartnerAct.thismHandler);
                    // 设置为沙箱模式,不设置默认为线上环境;从这里开始跳转到支付宝界面;运行完支付pay()后回调;
                    // alipay.setSandBox(true);
                    String result = alipay.pay(orderInfo);
                    Log.i(TAG"result = " + result);
                    Message msg = new Message();
                    msg.what = RQF_PAY;
                    msg.obj = result;
                    mHandler.sendMessage(msg);
                }
            }.start();
        }
        catch (Exception ex) {
            ex.printStackTrace();
            Toast.makeText(ExternalPartnerAct.this, R.string.remote_call_failed, Toast.LENGTH_SHORT).show();
        }
    }  

  /**
     * @description:加载支付宝网页
     * @author samy
     * @date 2014年10月16日 下午7:16:41
     */
    private void payByZFBWeb() {
        // KJHttp kjHttp = GlobalApp.getKJHttp();
        KJStringParams params = new KJStringParams();
        params.put("trade_no"orderId);
        params.put("subject"shopItemBean.merchantName);
        params.put("total_fee"tempNeedPrice >= 0 ? tempNeedPrice + "" : (-tempNeedPrice) + "");
        // kjHttp.urlGet(UrlConstants.PAY_SUBMIT, params, null);//现不做回调处理;
        if (params != null) {
            // StringBuilder是用来组拼请求地址和参数
            StringBuilder str = new StringBuilder(UrlConstants.PAY_SUBMIT);
            // str.append("?").append(params.toString());
            str.append("?");
            if (params != null && params.urlParams.size() != 0) {
                for (ConcurrentHashMap.Entry<String, String> entry : params.urlParams.entrySet()) {
                    // 如果请求参数中有中文,需要进行URLEncoder编码 gbk/utf8
                    try {
                        str.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8"));
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                    str.append("&");
                }
                str.deleteCharAt(str.length() - 1);
            }
            confirm_order_btn.setEnabled(false);
            Bundle bundle = new Bundle();
            bundle.putString(BaseWebViewAct.PAGE_TITLE"支付宝支付");
            bundle.putString(BaseWebViewAct.PAGE_URL, str.toString());
            showActivity(aty, PayByZFBAct.class, bundle);
        }
    }  
开发中可能常出现的问题:
(1):调起快捷支付宝不出来;更换最新的assets下快捷支付的apk问当前最新的;





源码下载:http://download.csdn.net/detail/hongliuxing/8090903  
                http://download.csdn.net/detail/hongliuxing/8090891
官方支付:http://download.csdn.net/detail/hongliuxing/8090923



来自为知笔记(Wiz)


支付宝支付总结