支付宝支付之APP支付

官方文档:支付宝App支付

1.登陆支付宝开放平台,,创建应用,配置开发公,私钥,得到支付宝公钥,同时申请应用的支付权限(app支付和网页支付需要的权限不同,针对不同需求,申请对应的权限)

查看-->下载官方的公钥生成工具,把生成的私钥(使用RSA则生成1024私钥,如果是RSA2则生成2048私钥)自己保存好,公钥填写入下图对应的应用公钥中(注意区分RSA和RSA2),然后就可以看到应用宝公钥也自动生成了。

 

 

2.支付宝支付核心代码

//          支付宝支付
            double total_fee=100;//支付费用
            total_fee=0.01;
            Map<String, String> keyValues = new HashMap<String, String>();
            String current_time=Utils.getCurrentTime();//得到当前时间 yyyy-MM-dd HH:mm:ss
            keyValues.put("app_id", 1200551222);//应用的appid

            keyValues.put("biz_content", "{\"timeout_express\":\"30m\",\"product_code\":\"QUICK_MSECURITY_PAY\",\"total_amount\":\""+total_fee+"\",\"subject\":\""+description+"\",\"body\":\""+body+"\",\"out_trade_no\":\"" +order.getPay_num() +  "\"}");

            keyValues.put("charset", "utf-8");

            keyValues.put("method", "alipay.trade.app.pay");

            keyValues.put("sign_type", "RSA");

            keyValues.put("timestamp", current_time);

            keyValues.put("version", "1.0");

            keyValues.put("notify_url", PayConfigUtils.getAlipay_notify_url());//支付结果通知地址

            String sign=getSign(keyValues,PayConfigUtils.getPrivate_key());
            String json=buildOrderParam(keyValues)+"&"+sign;

 

/**
     * 构造支付订单参数信息
     *
     * @param map
     * 支付订单参数
     * @return
     */
    public static String buildOrderParam(Map<String, String> map) {
        List<String> keys = new ArrayList<String>(map.keySet());

        Collections.sort(keys);

        StringBuilder authInfo = new StringBuilder();
        for (int i = 0; i < keys.size() - 1; i++) {
            String key = keys.get(i);
            String value = map.get(key);
            try {
                value=URLEncoder.encode(value,"UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            authInfo.append(buildKeyValue(key, value, false));
            authInfo.append("&");
        }

        String tailKey = keys.get(keys.size() - 1);
        String tailValue = map.get(tailKey);
        authInfo.append(buildKeyValue(tailKey, tailValue, true));

        return authInfo.toString();
    }

  

private static String buildKeyValue(String key, String value, boolean isEncode) {
        StringBuilder sb = new StringBuilder();
        sb.append(key);
        sb.append("=");
        if (isEncode) {
            try {
                sb.append(URLEncoder.encode(value, "UTF-8"));
            } catch (UnsupportedEncodingException e) {
                sb.append(value);
            }
        } else {
            sb.append(value);
        }
        return sb.toString();
    }

  

public static String getSign(Map<String, String> map, String rsaKey) {
        List<String> keys = new ArrayList<String>(map.keySet());
        // key排序
        Collections.sort(keys);

        StringBuilder authInfo = new StringBuilder();
        for (int i = 0; i < keys.size() - 1; i++) {
            String key = keys.get(i);
            String value = map.get(key);
            authInfo.append(buildKeyValue(key, value, false));
            authInfo.append("&");
        }

        String tailKey = keys.get(keys.size() - 1);
        String tailValue = map.get(tailKey);
        authInfo.append(buildKeyValue(tailKey, tailValue, false));

        String oriSign = SignUtils.sign(authInfo.toString(), rsaKey);
        String encodedSign = "";

        try {
            encodedSign = URLEncoder.encode(oriSign, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return "sign=" + encodedSign;
    }

  

3.支付参数全部得到,app下载对应的sdk,拿到已经构造好的参数,就可以直接去调起支付宝了!

 

posted @ 2017-02-23 15:35  流年飞逝  阅读(255)  评论(0编辑  收藏  举报