springboot調用支付寶接口,實際付款、查詢訂單、退款

一、支付寶的文檔中心

https://opendocs.alipay.com/apis/api_1/alipay.trade.refund

這三個接口是PC頁面最重要的三個接口,在支付寶的文檔中心,有代碼的式例,封裝參數不要使用支付寶的式例代碼那樣,使用map集合封裝參數,然後使用Json轉化爲String,接口的回覆按照文檔中說的,用get和文檔中的回覆參數(用駝峯表示)

二、maven依賴

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.21.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
    <dependency>
        <groupId>com.alipay.sdk</groupId>
        <artifactId>alipay-sdk-java</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.62</version>
    </dependency>
</dependencies>

三、支付寶的配置文件 alipay.properties

#支付寶的接口地址
alipay_url=https://openapi.alipay.com/gateway.do
#商家我們自己企業的合作伙伴id
app_id=
#商家我們自己的私鑰
app_private_key=
#支付寶的公鑰
alipay_public_key=
# 同步回調地址 重定向地址本地瀏覽器
return_payment_url=http://127.0.0.1:8080/alipay/callback/return

# 異步通知地址 公網接口(webService)
notify_payment_url=http://60.205.215.91/alipay/callback/notify

return_order_url=http://127.0.0.1:8080/orderList

四、加載Alipay的配置導spring容器中  AlipayConfig

package com.junlaninfo.alipay.config;

import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
/**
 * @param
 * @return
 */
@Configuration
@PropertySource("classpath:alipay.properties")
public class AlipayConfig {
    @Value("${alipay_url}")
    private String alipay_url;
    @Value("${app_private_key}")
    private String app_private_key;
    @Value("${app_id}")
    private String app_id;
    public final static String format = "json";
    public final static String charset = "utf-8";
    public final static String sign_type = "RSA2";
    public static String return_payment_url;
    public static String notify_payment_url;
    public static String return_order_url;
    public static String alipay_public_key;

    @Value("${alipay_public_key}")
    public void setAlipay_public_key(String alipay_public_key) {
        AlipayConfig.alipay_public_key = alipay_public_key;
    }

    @Value("${return_payment_url}")
    public void setReturn_url(String return_payment_url) {
        AlipayConfig.return_payment_url = return_payment_url;
    }

    @Value("${notify_payment_url}")
    public void setNotify_url(String notify_payment_url) {
        AlipayConfig.notify_payment_url = notify_payment_url;
    }

    @Value("${return_order_url}")
    public void setReturn_order_url(String return_order_url) {
        AlipayConfig.return_order_url = return_order_url;
    }

    @Bean
    public AlipayClient alipayClient() {
        AlipayClient alipayClient = new DefaultAlipayClient(alipay_url, app_id, app_private_key, format, charset, alipay_public_key, sign_type);
        return alipayClient;
    }
}

五、編寫代碼 (支付、查詢訂單狀態、退款)

package com.junlaninfo.controller;

import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.junlaninfo.alipay.config.AlipayConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * Created by 輝 on 2020/3/29.
 */
@Controller
public class AlipayController {
    @Autowired
    AlipayClient alipayClient;

    @RequestMapping(value = "/alipay",method = RequestMethod.GET)
    @ResponseBody
    public  String   Alipay(){
        // 獲得一個支付寶請求的客戶端(它並不是一個鏈接,而是一個封裝好的http的表單請求)
        String form = null;
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();//創建API對應的request

        // 回調函數
        alipayRequest.setReturnUrl(AlipayConfig.return_payment_url);
        alipayRequest.setNotifyUrl(AlipayConfig.notify_payment_url);

        Map<String,Object> map = new HashMap<String,Object>();
        map.put("out_trade_no", UUID.randomUUID());
        map.put("product_code","FAST_INSTANT_TRADE_PAY");
        map.put("total_amount",0.01);
        map.put("subject","測試用的");

        String param = JSON.toJSONString(map);

        alipayRequest.setBizContent(param);

        try {
            form = alipayClient.pageExecute(alipayRequest).getBody(); //調用SDK生成表單
            System.out.println(form);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return form;
    }

    /*
        支付同步回調
     */
    @RequestMapping("/alipay/callback/return")
    @ResponseBody
    public  String   AlipayReturn(HttpServletRequest  request){
        String trade_no = request.getParameter("trade_no");
        System.out.println("支付寶交易號是:"+trade_no);
        return  trade_no;
    }
  /*
    統一收單線下交易查詢
    */
    @RequestMapping(value = "/alipayQuery",method = RequestMethod.GET)
    @ResponseBody
    public  String  AlipayQuery() throws AlipayApiException {
        // 獲得一個支付寶請求的客戶端(它並不是一個鏈接,而是一個封裝好的http的表單請求)
        String form = null;
        AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();;//創建API對應的request

        // 回調函數
        alipayRequest.setReturnUrl(AlipayConfig.return_payment_url);
        alipayRequest.setNotifyUrl(AlipayConfig.notify_payment_url);

        Map<String,Object> map = new HashMap<String,Object>();
        map.put("trade_no","2020040222001425041434036943");//測試用時生成的支付寶訂單號
        String param = JSON.toJSONString(map);
        alipayRequest.setBizContent(param);
        AlipayTradeQueryResponse response = alipayClient.execute(alipayRequest);
        String msg = response.getMsg();
        String outTradeNo = response.getOutTradeNo();
        String tradeNo = response.getTradeNo();
        String tradeStatus = response.getTradeStatus();
        String call_back_content=response.getMsg();
        System.out.println(msg);
        return   msg;
    }

    @RequestMapping(value = "/AlipayRefund")
    @ResponseBody
    public  String AlipayRefund() throws AlipayApiException {
        AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("trade_no","2020040222001425041434036943");
        map.put("refund_amount",0.01);
        String param = JSON.toJSONString(map);
        request.setBizContent(param);
        AlipayTradeRefundResponse response = alipayClient.execute(request);
        String fundChange = response.getFundChange();//    本次退款是否發生了資金變化
        System.out.println("\t本次退款是否發生了資金變化:"+fundChange);
        Date gmtRefundPay = response.getGmtRefundPay();  //退款時間
        System.out.println("退款時間:"+gmtRefundPay);
        return fundChange;
    }


}

六、代碼鏈接

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章