支付寶支付

支付寶支付接入流程

接入流程

入駐開放平臺(tái)

打開支付寶開放平臺(tái)https://open.alipay.com/platform/home.htm

入駐成自由開發(fā)者

獲取沙箱賬號(hào)

點(diǎn)擊開發(fā)中心 -> 研發(fā)服務(wù)

沙箱賬號(hào)

復(fù)制出來到文本文件備用,點(diǎn)擊沙箱工具跪者,下載沙箱版錢包,分別用商家坑夯、賣家賬號(hào)進(jìn)行登錄

設(shè)置應(yīng)用公鑰

設(shè)置應(yīng)用公鑰

設(shè)置回調(diào)地址

設(shè)置回調(diào)地址
利用ngrok進(jìn)行內(nèi)網(wǎng)穿透

點(diǎn)擊下載:ngrok下載地址
運(yùn)行ngrok:

ngrok http 8080 #轉(zhuǎn)發(fā)請(qǐng)求到本機(jī)8080端口

代碼實(shí)現(xiàn)

POM
    <!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
    <dependency>
        <groupId>com.alipay.sdk</groupId>
        <artifactId>alipay-sdk-java</artifactId>
        <version>3.4.27.ALL</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
    </dependency>
配置文件application.yml:
alipay:
  gatewayUrl: https://openapi.alipaydev.com/gateway.do
  appid: 2016092800614971
  privateKey: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDTRiTjtaJCBjGtRTMnqjLu2PEXs/4ZHbW6bNSqO6ScmbUdPcn+nNIcjGZKwhXeuVDXjqRDGuwCw9EVY2rI/rA0Qz7QX9fbsGzA4GQ4JK0cerHJjp386hRtKSEj6Gp/JMa34KPlbLtLLg9oxz/dA5e+tqIciNwi4b7ln5pH0bhGpcUxbjcwsKq7GBdMp+FtfhavuyOxwa4+w17jI9idTrAq6M+f/AngDngyJOMA7xSkpKfr+tB3iI56ZhD1ngh0zoFg9I3hksUuTHxhe4UWxCD7aYGX15qb8Hc2/3hWK3m2drCl7l6z/RhVmwaqsv5bzBfGzQmucatBjkIcjqpefzS1AgMBAAECggEAPBmhFtGthaCjcwnTYn4tHPrDop2GM/jaoFyjJoXu7sle1yGjm3Va49ogozWQ6RnIYHloStqWtrajfLUaRHEHCOb0MGyDSDBoz3lFqR7ty8MvXgne8XpZMzBXCBLucJqymM4jcXk70kgZBBJiHWoPOaZUeU+JZ7bWChYb2kBTbmzmvtC+XbXBWjpybFfVjOrnl1u2vnfuTrF6ds8yklb/ugxw4KyvfK03iVLsB0vLo3y0QtmN7bC4zQLqDPVlmdsdDiZIxl+rZmka4AKFIhAn7HHG2KfRLUa6z1+GWj/phFlkQ5pBo11jMq8p+is6z+/xGMpxtli1HKYTxE0lckqpYQKBgQD/6NvaXLJ/WSV2jLL4OhRFj6DGUuIagfxEFyYCjPxLDhug/8tUldmKXPvpcNvyAzTTBkotWDPjfGFf41EEznhpNGdJa61B/JIqU/gyfgX4Umb5Rkny8CAfDou+I1tWEeCs65GDBJqLSW35cenUnSczKP5TJIgDQwLjJJygRQDQeQKBgQDTWT/AD5KwzMv94Y36x+NO1eEFDz9p5u/fNghH4N76qet5qvnD80oIHxXQdfkkXuNqLjywlv5YAGXXs1OHdPKDbb7I8tlO4BmEuJ5DI/bpf/hP5x+jkGgbGwEOxmzVtkKLfksLegJvYthxC/LvZXzSz2KcN8qaQfpp2kI8a5SPHQKBgQDFuVkE4lJX6rzzV8p/2AAJrut90FQ6Pux2f5wypFPaedAHGRw1AoLOUQGiYDzQRIHv+hAd8ORGg7eIqs3SdOS8BG05YSTAszEL200NVimur5w4RYKlXbqzxD1cb10Gp1F8yZXoMQpnTBjYfpc4WyQKd0XpX3RncMMuVP9fJXF3oQKBgBLpIXMl8ZIwQPBuhi2yRPyA1qmFO79WEpB+XS9RR6JWIeO5ELAfzLf9UA5e//PpKaAOkw+Z8xgcsQAj441zQV/RKgkA8cDE/IOLoV2Qkj9CXA2KOKKCAU6rk+SmjIZy0HF602wrdpxQ090JnKsfAZQ7Si+ALniu/qEKDnMpjRlhAoGBALyenYIQtXvW4KFgQkJJYZwSbrdnG/3+aGcgEEHL9P/pcDrPjy264k2vs8zu7Z979A7qG0ej6fpRLuwCJ48UbIFdi/R1etpf+QsJAZHDm0xmunSxeFacMZ1Gnkox0stZVIEGhOy39mmjmp7IIuDUHJYoFikDyk+Rgk/aEUi4EImR
  alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA00Yk47WiQgYxrUUzJ6oy7tjxF7P+GR21umzUqjuknJm1HT3J/pzSHIxmSsIV3rlQ146kQxrsAsPRFWNqyP6wNEM+0F/X27BswOBkOCStHHqxyY6d/OoUbSkhI+hqfyTGt+Cj5Wy7Sy4PaMc/3QOXvraiHIjcIuG+5Z+aR9G4RqXFMW43MLCquxgXTKfhbX4Wr7sjscGuPsNe4yPYnU6wKujPn/wJ4A54MiTjAO8UpKSn6/rQd4iOemYQ9Z4IdM6BYPSN4ZLFLkx8YXuFFsQg+2mBl9eam/B3Nv94Vit5tnawpe5es/0YVZsGqrL+W8wXxs0JrnGrQY5CHI6qXn80tQIDAQAB
  #支付成功跳轉(zhuǎn)的商家url
  returnUrl: http://localhost:8080/callback
  #異常跳轉(zhuǎn)頁面
  notifyUrl: https://354c9624.ngrok.io/callback_nsync
Java配置文件

AlipayConfig.java

package com.suoron.springboot.config;

import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(AlipayProperties.class)
public class AlipayConfig {

    @Resource
    private AlipayProperties properties;

    /**
     * alipay-sdk-java
     * @return
     */
    @Bean
    public AlipayClient alipayClient(){
        return new DefaultAlipayClient(properties.getGatewayUrl(),
                properties.getAppid(),
                properties.getPrivateKey(),
                properties.getFormate(),
                properties.getCharset(),
                properties.getAlipayPublicKey(),
                properties.getSignType());
    }
}

AlipayProperties.java

package com.suoron.springboot.config;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.util.StringUtils;

import javax.annotation.PostConstruct;

/**
 * 支付寶支付的參數(shù)配置
 *
 * @author Suoron
 */
@Data
@Slf4j
@ConfigurationProperties(prefix = "alipay")
public class AlipayProperties {

    /** 支付寶gatewayUrl */
    private String gatewayUrl;
    /** 商戶應(yīng)用id */
    private String appid;
    /** RSA私鑰,用于對(duì)商戶請(qǐng)求報(bào)文加簽 */
    private String privateKey;
    /** 支付寶RSA公鑰淑履,用于驗(yàn)簽支付寶應(yīng)答 */
    private String alipayPublicKey;
    /** 簽名類型 */
    private String signType = "RSA2";

    /** 格式 */
    private String formate = "json";
    /** 編碼 */
    private String charset = "UTF-8";

    /** 同步地址 */
    private String returnUrl;

    /** 異步地址 */
    private String notifyUrl;

    /** 最大查詢次數(shù) */
    private static int maxQueryRetry = 5;
    /** 查詢間隔(毫秒) */
    private static long queryDuration = 5000;
    /** 最大撤銷次數(shù) */
    private static int maxCancelRetry = 3;
    /** 撤銷間隔(毫秒) */
    private static long cancelDuration = 3000;

    private AlipayProperties() {}

    /**
     * PostContruct是spring框架的注解,在方法上加該注解會(huì)在項(xiàng)目啟動(dòng)的時(shí)候執(zhí)行該方法狸吞,也可以理解為在spring容器初始化的時(shí)候執(zhí)行該方法。
     */
    @PostConstruct
    public void init() {
        log.info(description());
    }

    public String description() {
        StringBuilder sb = new StringBuilder("\nConfigs{");
        sb.append("支付寶網(wǎng)關(guān): ").append(gatewayUrl).append("\n");
        sb.append(", appid: ").append(appid).append("\n");
        sb.append(", 商戶RSA私鑰: ").append(getKeyDescription(privateKey)).append("\n");
        sb.append(", 支付寶RSA公鑰: ").append(getKeyDescription(alipayPublicKey)).append("\n");
        sb.append(", 簽名類型: ").append(signType).append("\n");

        sb.append(", 查詢重試次數(shù): ").append(maxQueryRetry).append("\n");
        sb.append(", 查詢間隔(毫秒): ").append(queryDuration).append("\n");
        sb.append(", 撤銷嘗試次數(shù): ").append(maxCancelRetry).append("\n");
        sb.append(", 撤銷重試間隔(毫秒): ").append(cancelDuration).append("\n");
        sb.append("}");
        return sb.toString();
    }

    private String getKeyDescription(String key) {
        int showLength = 6;
        if (!StringUtils.isEmpty(key) && key.length() > showLength) {
            return new StringBuilder(key.substring(0, showLength)).append("******")
                    .append(key.substring(key.length() - showLength)).toString();
        }
        return null;
    }
}
請(qǐng)求Service

AlipayService.java

package com.suoron.springboot.service;

public interface AlipayService {
    public String getwayPay();
}

AlipayServiceImpl.java

package com.suoron.springboot.service.impl;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayResponse;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.domain.AlipayTradePrecreateModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.suoron.springboot.config.AlipayProperties;
import com.suoron.springboot.service.AlipayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.UUID;

@Service
public class AlipayServiceImpl implements AlipayService {

    @Resource
    private AlipayClient alipayClient;

    @Resource
    private AlipayProperties aliPayProperties;

    @Override
    public String getwayPay() {
        String productCode = "FAST_INSTANT_TRADE_PAY";
        AlipayTradePagePayModel model = new AlipayTradePagePayModel();
        model.setOutTradeNo(UUID.randomUUID().toString());
        model.setSubject("支付測(cè)試");
        model.setTotalAmount("10");
        model.setBody("支付測(cè)試,共10元");
        model.setProductCode(productCode);

        AlipayTradePagePayRequest pagePayRequest = new AlipayTradePagePayRequest();
        pagePayRequest.setReturnUrl(aliPayProperties.getReturnUrl());
        pagePayRequest.setNotifyUrl(aliPayProperties.getNotifyUrl());
        pagePayRequest.setBizModel(model);

        // 調(diào)用SDK生成表單, 并直接將完整的表單html輸出到頁面
        String retStr = null;
        try {
            retStr = alipayClient.pageExecute(pagePayRequest).getBody();
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return retStr;
    }

}
支付請(qǐng)求Controller
package com.suoron.springboot.controller;

import com.sun.deploy.net.HttpResponse;
import com.suoron.springboot.service.AlipayService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

/**
 * @author Suoron
 */


@Controller
public class TestController {

    @Resource
    AlipayService alipayService;

    @RequestMapping(value = "/test",method = RequestMethod.GET)
    public void test(HttpServletResponse response){
        try {
            response.setContentType("text/html; charset=utf-8");
            response.getWriter().write("<h1>支付測(cè)試</h1>");
            response.getWriter().write("<br/><a href='paytest'>前往支付頁面</a>");
            response.getWriter().close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @RequestMapping(value = "/paytest",method = RequestMethod.GET)
    public void testPay(HttpServletResponse response){
        try {
            response.setContentType("text/html; charset=utf-8");
            response.getWriter().write(alipayService.getwayPay());
            response.getWriter().close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @RequestMapping(value = "/callback",method = RequestMethod.GET)
    public void callback(HttpServletRequest request,HttpServletResponse response){
        try {
            response.setContentType("text/html; charset=utf-8");
            Enumeration enu = request.getParameterNames();
            while(enu.hasMoreElements()){
                String paraName=(String)enu.nextElement();
                response.getWriter().write(paraName+": "+request.getParameter(paraName)+"<br>");
            }
            response.getWriter().close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @RequestMapping(value = "/callback_nsync")
    public void callback_nsync(HttpServletRequest request,HttpServletResponse response){
        System.out.println("1111111111111111111111111111");
        try {
            response.setContentType("text/html; charset=utf-8");
            Enumeration enu = request.getParameterNames();
            while(enu.hasMoreElements()){
                String paraName=(String)enu.nextElement();
                System.out.println(paraName+": "+request.getParameter(paraName));
            }
            response.getWriter().close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市像街,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镰绎,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件随静,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡挪挤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門扛门,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纵寝,“玉大人,你說我怎么就攤上這事爽茴。” “怎么了室奏?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胧沫。 經(jīng)常有香客問我占业,道長纯赎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任念恍,我火速辦了婚禮晚顷,結(jié)果婚禮上峰伙,老公的妹妹穿的比我還像新娘该默。我一直安慰自己,他們只是感情好权均,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恋沃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪囊咏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天梅割,我揣著相機(jī)與錄音葛家,去河邊找鬼户辞。 笑死癞谒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弹砚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼桌吃,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呕屎,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤敬察,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后莲祸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椭迎,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锐帜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年畜号,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片简软。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖建炫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肛跌,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布衍慎,位于F島的核電站皮钠,受9級(jí)特大地震影響稳捆,放射性物質(zhì)發(fā)生泄漏麦轰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一原朝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喳坠,春花似錦、人聲如沸壕鹉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牍白。三九已至抖棘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間切省,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工朝捆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芙盘。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像儒老,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贷盲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容