JAVA支付寶支付最全教程02 支付寶系統接入 (NATIVE掃碼支付)


本文章由Covenant. XJT編寫,在未允許的情況下請勿轉載

 

 

 

前一節介紹了如何獲取APPID等參數,下面開始系統接入的代碼准備

配置文件AlipayConfig.java(配置基本參數)

 

public class AlipayConfig {

  // 應用ID,您的APPID,收款賬號既是您的APPID對應支付寶賬號 
  public static String app_id = "填寫沙箱環境appid";

  // 商戶私鑰,您的PKCS8格式RSA2私鑰 在設置密鑰時生成的應用私鑰2048中 
  public static String merchant_private_key = "填寫自己設置的密鑰返回的應用私鑰";

  // 服務器異步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問

  //支付成功后的異步通知url
  public static String notify_url = "填寫服務器相關路徑";

  // 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問

  //支付成功后的跳轉url
  public static String return_url = "填寫服務器相關路徑";

  // 簽名方式 不必修改
  public static String sign_type = "RSA2";

  // 字符編碼格式 不必修改
  public static String charset = "utf-8";

  // 支付寶網關 正式環境:https://openapi.alipay.com/gateway.do 下面填寫的是沙箱環境的網關,接入正式環境時記得修改

  public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";

下面是回調類Return,具體業務可在此編寫(此處為SpringBoot框架編寫方式)

public String Return(HttpServletRequest request){    Map<String,String> params = new HashMap<String,String>();

 Map<String,String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//亂碼解決,這段代碼在出現亂碼時使用
try {
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
params.put(name, valueStr);
}
boolean signVerified = false; //調用SDK驗證簽名
try {
signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfigPc.alipay_public_key, AlipayConfigPc.charset, AlipayConfigPc.sign_type);
} catch (AlipayApiException e) {
e.printStackTrace();
}

//驗證簽名
if(signVerified) {
//此處編寫具體需要實現的業務邏輯
}
}

下面是統一下單接口類pay,此處可以修改為業務需要的訂單信息

 

public String pay() {

//獲得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

//設置請求參數
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(AlipayConfig.return_url);
alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

//商戶訂單號,商戶網站訂單系統中唯一訂單號,必填
String out_trade_no = "此處填寫自定義的訂單號,可用UUID.randomUUID()方法";
//付款金額,必填
String total_amount = "此處填寫付款金額,金額不得小於0.01";
//訂單名稱,必填
String subject = “此處自定義”;
//商品描述,可空
String body =“此處自定義” ;

alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
+ "\"total_amount\":\""+ total_amount +"\","
+ "\"subject\":\""+ subject +"\","
+ "\"body\":\""+ body +"\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

//若想給BizContent增加其他可選請求參數,可以在支付寶開放中心相關的文檔中查看請求參數項
//alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
// + "\"total_amount\":\""+ total_amount +"\","
// + "\"subject\":\""+ subject +"\","
// + "\"body\":\""+ body +"\","
// + "\"timeout_express\":\"10m\","
// + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

//請求
String result = alipayClient.pageExecute(alipayRequest).getBody();

//請注意,此處返回后會自動跳轉到支付寶的支付頁面
return result

}

下面編寫支付寶的退款接口alipayRefund,具體情況視實際生產情況修改代碼
    public void alipayrefund(){

//商戶訂單號和支付寶交易號不能同時為空。 trade_no、 out_trade_no如果同時存在優先取trade_no
//商戶訂單號,和支付寶交易號二選一
String out_trade_no = "此處推薦從數據庫獲取訂單號";
//支付寶交易號,和商戶訂單號二選一
String trade_no ="此處推薦從數據庫獲取訂單號";
        //退款金額,不能大於訂單總金額
String refund_amount = "自定義";
//退款的原因說明
String refund_reason = "自定義";
//標識一次退款請求,同一筆交易多次退款需要保證唯一,如需部分退款,則此參數必傳。
String out_request_no = "退款單號,自定義,推薦保存到數據庫中";
/**********************/
// SDK 公共請求類,包含公共請求參數,以及封裝了簽名與驗簽,開發者無需關注簽名與驗簽
AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE);
AlipayTradeRefundRequest alipay_request = new AlipayTradeRefundRequest();

AlipayTradeRefundModel model=new AlipayTradeRefundModel();
model.setOutTradeNo(out_trade_no);
model.setTradeNo(trade_no);
model.setRefundAmount(refund_amount);
model.setRefundReason(refund_reason);
model.setOutRequestNo(out_request_no);
alipay_request.setBizModel(model);

AlipayTradeRefundResponse alipay_response = null;
try {
alipay_response = client.execute(alipay_request);
} catch (AlipayApiException e) {
e.printStackTrace();
}

if(alipay_response.getCode().equals("10000")){
//退款成功后的業務邏輯
}
    //退款失敗的業務邏輯


}}



這一節介紹了部分支付寶的接口和配置文件的接入和編寫,下節介紹支付寶的查詢接口,退款查詢接口等

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM