1. 程式人生 > >app支付寶支付

app支付寶支付

支付寶app支付用了3天時間將後臺程式碼給寫完了,做得有點粗糙,希望有東西大家可以借鑑

app支付流程,java後臺做得其實比較少

直接上程式碼

 

String json = "{\"timeout_express\":\"" + timeout_express +
        "\",\"product_code\":\"" + product_code +
        "\",\"total_amount\":\"" + totalFee +
        "\",\"subject\":\"" + subject +
        "\",\"body\":\"" + body +
        "\",\"out_trade_no\":\"" + paymentID +
        "\",\"notify_url\":\"" + notify_url + "\"}";

// logger.info("訂單號========================" + paymentID);
//借用支付寶的demo 來構造引數
Map<String, String> params = OrderInfoUtil2_0.buildOrderParamMap(payConfig.getAppId(), true, json);
//構造支付訂單引數資訊
String orderParam = OrderInfoUtil2_0.buildOrderParam(params);

String privateKey = payConfig.getPrivateKey();
//對支付引數資訊進行簽名
String sign = OrderInfoUtil.getSign(params, privateKey, true);
String orderInfo = orderParam + "&" + sign;
//防止http請求後將&timestamp變成*tim
String replace = orderInfo.replace("&timestamp", "wanliu20180506");

OrderInfoUtil2_0這個使用阿里demo就行

WS_APP_PAY_SDK_BASE_2.0\Demo\AndroidDemo_2.0(SDK_15.5.3)\alipay_demo\app\src\main\java\com\alipay\sdk\pay\demo\util

另外這裡有坑,就是這個orderInfo裡面的&timestamp轉換,不然後再http請求的時候自動轉換成別的

 

 

package com.odfly.module.component.Util;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Random;


public class OrderInfoUtil {

   /**
    * 構造授權引數列表
    *
    * @param pid
    * @param app_id
    * @param target_id
    * @return
    */
   public static Map<String, String> buildAuthInfoMap(String pid, String app_id, String target_id, boolean rsa2) {
      Map<String, String> keyValues = new HashMap<String, String>();

      // 商戶簽約拿到的app_id,如:201302220024223
      keyValues.put("app_id", app_id);

      // 商戶簽約拿到的pid,如:2088133223816631
      keyValues.put("pid", pid);

      // 服務介面名稱, 固定值
      keyValues.put("apiname", "com.alipay.account.auth");

      // 商戶型別標識, 固定值
      keyValues.put("app_name", "mc");

      // 業務型別, 固定值
      keyValues.put("biz_type", "openservice");

      // 產品碼, 固定值
      keyValues.put("product_id", "APP_FAST_LOGIN");

      // 授權範圍, 固定值
      keyValues.put("scope", "kuaijie");

      // 商戶唯一標識,如:kkkkk091125
      keyValues.put("target_id", target_id);

      // 授權型別, 固定值
      keyValues.put("auth_type", "AUTHACCOUNT");

      // 簽名型別
      keyValues.put("sign_type", rsa2 ? "RSA2" : "RSA");

      return keyValues;
   }


   /**
    * 構造支付訂單引數列表
    *
    * @param app_id
    * @return
    */
   public static Map<String, String> buildOrderParamMap(String app_id, boolean rsa2,String json) {
      Map<String, String> keyValues = new HashMap<String, String>();

      keyValues.put("app_id", app_id);

      keyValues.put("biz_content", json);

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

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

      keyValues.put("sign_type", rsa2 ? "RSA2" : "RSA");
      SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      java.util.Date date=new java.util.Date();
      String str=sdf.format(date);

      keyValues.put("timestamp", str);

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


      return keyValues;
   }

   /**
    * 構造支付訂單引數資訊
    *
    * @param map 支付訂單引數
    * @return
    */
   public static String buildOrderParam(Map<String, String> map) {
      List<String> keys = new ArrayList<String>(map.keySet());

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

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

      return sb.toString();
   }

   /**
    * 拼接鍵值對
    *
    * @param key
    * @param value
    * @param isEncode
    * @return
    */
   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();
   }

   /**
    * 對支付引數資訊進行簽名
    *
    * @param map 待簽名授權資訊
    * @return
    */
   public static String getSign(Map<String, String> map, String rsaKey, boolean rsa2) {
      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, rsa2);
      String encodedSign = "";

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

   /**
    * 要求外部訂單號必須唯一。
    *
    * @return
    */
   private static 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;
   }

}