激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - SpringBoot實(shí)現(xiàn)簡(jiǎn)易支付寶網(wǎng)頁(yè)支付功能

SpringBoot實(shí)現(xiàn)簡(jiǎn)易支付寶網(wǎng)頁(yè)支付功能

2022-02-24 00:55早睡的小倪 Java教程

小編最近實(shí)現(xiàn)一個(gè)功能基于springboot程序的支付寶支付demo,非常不錯(cuò)適合初學(xué)者入門(mén)學(xué)習(xí)使用,今天把SpringBoot實(shí)現(xiàn)簡(jiǎn)易支付寶網(wǎng)頁(yè)支付功能的示例代碼分享給大家,感興趣的朋友參考下吧

該文章描述了一個(gè)基于SpringBoot程序的支付寶支付demo,由于是個(gè)人開(kāi)發(fā)者而非企業(yè),因此設(shè)計(jì)到的技術(shù)較為簡(jiǎn)單,功能也有局限,適合初學(xué)者入門(mén)學(xué)習(xí)【我自己就是哈哈哈】

 

準(zhǔn)備工作

流程簡(jiǎn)介

SpringBoot實(shí)現(xiàn)簡(jiǎn)易支付寶網(wǎng)頁(yè)支付功能

該圖截取于支付寶開(kāi)放平臺(tái)官網(wǎng),描述了消費(fèi)者和商戶【開(kāi)發(fā)者】服務(wù)器和支付寶服務(wù)間的請(qǐng)求流程,可以看到用戶是通過(guò)商戶的服務(wù)器進(jìn)行發(fā)送支付請(qǐng)求,再由消費(fèi)者輸入相關(guān)用戶登錄信息和支付信息【該流程商戶服務(wù)器無(wú)法干預(yù)和監(jiān)聽(tīng)】,用戶和支付寶方的結(jié)果會(huì)由支付寶服務(wù)器通知回商戶服務(wù)器,商戶服務(wù)器可以編寫(xiě)對(duì)應(yīng)的邏輯去處理。

 

獲取相關(guān)支付秘鑰信息

由于是個(gè)人開(kāi)發(fā),沒(méi)有企業(yè)的營(yíng)業(yè)執(zhí)照,因此自己采取的是使用沙箱模型進(jìn)行支付寶模擬,對(duì)應(yīng)的,支付寶掃碼軟件需要是沙箱版的支付寶,沙箱支付寶下載地址:支付寶

首先登陸螞蟻金服開(kāi)放平臺(tái),登錄后進(jìn)入管理中心

SpringBoot實(shí)現(xiàn)簡(jiǎn)易支付寶網(wǎng)頁(yè)支付功能

SpringBoot實(shí)現(xiàn)簡(jiǎn)易支付寶網(wǎng)頁(yè)支付功能

登錄后點(diǎn)擊該服務(wù),進(jìn)入后可以查看到屬于自己的沙箱測(cè)試賬號(hào)和一些公鑰私鑰等信息

SpringBoot實(shí)現(xiàn)簡(jiǎn)易支付寶網(wǎng)頁(yè)支付功能

<!--        aliPay相關(guān)SDK-->
<dependency>
  <groupId>com.alipay.sdk</groupId>
  <artifactId>alipay-sdk-java</artifactId>
  <version>4.17.5.ALL</version>
</dependency>
?
<!--        二維碼生成器-->
<dependency>
  <groupId>com.google.zxing</groupId>
  <artifactId>core</artifactId>
  <version>3.3.0</version>
</dependency>
<dependency>
  <groupId>com.google.zxing</groupId>
  <artifactId>javase</artifactId>
  <version>3.3.0</version>
</dependency>

這些信息很重要,我們可以在配置類中去定義配置這些信息,這里給出一個(gè)支付寶官方給出的配置類。

import java.io.FileWriter;
import java.io.IOException;
?
public class AlipayConfig {
  
//↓↓↓↓↓↓↓↓↓↓請(qǐng)?jiān)谶@里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
?
  // 應(yīng)用ID,您的APPID,收款賬號(hào)既是您的APPID對(duì)應(yīng)支付寶賬號(hào)
  public static String app_id = "你的APPID";
  
  // 商戶私鑰,您的PKCS8格式RSA2私鑰
  public static String merchant_private_key = "你的私鑰";
  
  // 支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對(duì)應(yīng)APPID下的支付寶公鑰。
  public static String alipay_public_key="你的應(yīng)用公鑰";
  // 下面是兩個(gè)回調(diào)地址,指支付成功后用戶會(huì)跳轉(zhuǎn)到哪些頁(yè)面,不填也可以
  // 服務(wù)器異步通知頁(yè)面路徑  需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問(wèn)
  public static String notify_url = "http://工程公網(wǎng)訪問(wèn)地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
  // 頁(yè)面跳轉(zhuǎn)同步通知頁(yè)面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問(wèn)
  public static String return_url = "http://工程公網(wǎng)訪問(wèn)地址/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";
?
  // 簽名方式
  public static String sign_type = "RSA2";
  
  // 字符編碼格式
  public static String charset = "UTF-8";
  
  // 沙箱支付寶網(wǎng)關(guān) 正式支付網(wǎng)關(guān)是 https://openapi.alipay.com/gateway.do 千萬(wàn)不要混淆了
  public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
  
  // 支付寶網(wǎng)關(guān)
  public static String log_path = "C:\\";
?
  // json格式
  public static String format = "json";
?
?
//↑↑↑↑↑↑↑↑↑↑請(qǐng)?jiān)谶@里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
?
  /** 
   * 寫(xiě)日志,方便測(cè)試(看網(wǎng)站需求,也可以改成把記錄存入數(shù)據(jù)庫(kù))
   * @param sWord 要寫(xiě)入日志里的文本內(nèi)容
   */
  public static void logResult(String sWord) {
      FileWriter writer = null;
      try {
          writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
          writer.write(sWord);
      } catch (Exception e) {
          e.printStackTrace();
      } finally {
          if (writer != null) {
              try {
                  writer.close();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }
  }
}
?

 

代碼編寫(xiě)

支付請(qǐng)求鏈接

上述準(zhǔn)備工作配置完之后,就可以編寫(xiě)controller了,在該controller中,許多信息都雜糅在了一起,實(shí)際上這些步驟可能需要拆分成多個(gè)步驟才是更合理的,這里僅僅為了代碼演示方便而放在一起。

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
?
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.data.domain.Pageable;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
?
/**
* @website https://el-admin.vip
* @author nijunwei
* @date 2021-10-18
**/
@Controller
@RequestMapping("/api/test")
public class TestController {
??   
  @GetMapping("/transcation")
  public   void   doPost (HttpServletRequest httpRequest,
                          HttpServletResponse httpResponse)   throws ServletException, IOException  {
      AlipayClient alipayClient =  new DefaultAlipayClient( AlipayConfig.gatewayUrl , AlipayConfig.app_id, AlipayConfig.merchant_private_key,AlipayConfig.format , AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);  //獲得初始化的AlipayClient
      AlipayTradePagePayRequest alipayRequest =  new  AlipayTradePagePayRequest(); //創(chuàng)建API對(duì)應(yīng)的request
?
      //商戶訂單號(hào),商戶網(wǎng)站訂單系統(tǒng)中唯一訂單號(hào),必填
      String out_trade_no = UUID.randomUUID().toString().substring(0,13);
      //付款金額,必填
      String total_amount = new String("88.88");
      //訂單名稱,必填
      String subject="冬天的第一杯奶茶";
      //商品描述,可空
      String body = new String("我的你的什么?你是我的優(yōu)樂(lè)美");
?
      String bizContent="{\"out_trade_no\":\""+ out_trade_no +"\","
              + "\"total_amount\":\""+ total_amount +"\","
              + "\"subject\":\""+ subject +"\","
              + "\"body\":\""+ body +"\","
              + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}";
      alipayRequest.setBizContent(bizContent);

?
//        alipayRequest.setBizContent(json);
      String form= "" ;
      try  {
          form = alipayClient.pageExecute(alipayRequest).getBody();  //調(diào)用SDK生成表單
      }  catch  (AlipayApiException e) {
          e.printStackTrace();
      }
      // 頁(yè)面刷新會(huì)客戶端
      httpResponse.setCharacterEncoding("UTF-8");
      httpResponse.setContentType("text/html;charset=UTF-8");
      httpResponse.getWriter().write(form); //直接將完整的表單html輸出到頁(yè)面
      httpResponse.getWriter().flush();
      httpResponse.getWriter().close();
  }
?
}

幾個(gè)比較值得注意的參數(shù),其余的請(qǐng)求體參數(shù)可以在支付寶開(kāi)放平臺(tái)查詢完整的參數(shù)含義

out_tarde_no:支付單號(hào),用于辨別是否重復(fù)確認(rèn),支付寶那邊會(huì)有一套機(jī)制防止用戶重復(fù)支付一個(gè)單號(hào)的訂單。
total_amount:支付金額,單位為元,可達(dá)到小數(shù)點(diǎn)后兩位,如88.88表示88元8角8分。
subject:支付時(shí)顯示訂單標(biāo)題
body:商品的信息描述
product_code:此處固定為FAST_INSTANT_TRADE_PAY,對(duì)于其他代碼的含義可查看官方文檔

使用沙箱支付寶請(qǐng)求該鏈接后頁(yè)面如下,不同頁(yè)面是不同請(qǐng)求地址的,但大致流程與原理一致。

SpringBoot實(shí)現(xiàn)簡(jiǎn)易支付寶網(wǎng)頁(yè)支付功能

使用沙箱支付寶進(jìn)入該連接就可以了,例如

http://localhost:8000/api/test/transcation

 

二維碼生成

那么外部該如何訪問(wèn)呢?使用支付寶的掃碼功能可以很好的解決這個(gè)問(wèn)題

一個(gè)生成QRCode的工具類如下

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
?
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
public class QRCodeGeneratorUtil {
  // 暫定圖片路徑
  private static final String QR_CODE_IMAGE_PATH = "D:\\eladmin\\eladmin\\QRCodePics\\test.png";
?
  private static void generateQRCodeImage(String text, int width, int height, String filePath) throws WriterException, IOException {
      QRCodeWriter qrCodeWriter = new QRCodeWriter();
?
      BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);
?
      Path path = FileSystems.getDefault().getPath(filePath);
?
      MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
?
  }
?
  public static void main(String[] args) {
      try {
          generateQRCodeImage("http://192.168.137.1:8000/api/test/transcation", 350, 350, QR_CODE_IMAGE_PATH);
      } catch (WriterException e) {
          System.out.println("Could not generate QR Code, WriterException :: " + e.getMessage());
      } catch (IOException e) {
          System.out.println("Could not generate QR Code, IOException :: " + e.getMessage());
      }
?
  }
?
}

主方法中生成了一張信息為

http://192.168.137.1:8000/api/test/transcation

長(zhǎng)寬為350的二維碼,掃描該二維嗎即可訪問(wèn)其中的信息【會(huì)直接向該鏈接發(fā)生請(qǐng)求】

其中,請(qǐng)求的ip地址如果部署在公網(wǎng)可以訪問(wèn)的服務(wù)器,那么直接使用手機(jī)上的沙箱支付寶掃描即可。如果沒(méi)有公網(wǎng)的服務(wù)器【如阿里云】那么可以讓手機(jī)和電腦置于同一局域網(wǎng)然后內(nèi)網(wǎng)訪問(wèn),或者使用電腦自帶的熱點(diǎn)功能,開(kāi)啟后讓手機(jī)連接。

SpringBoot實(shí)現(xiàn)簡(jiǎn)易支付寶網(wǎng)頁(yè)支付功能

然后打開(kāi)cmd,查看局域網(wǎng)內(nèi)網(wǎng)絡(luò)配置,輸入ipconfig查看,如果是linux,則ifconfig

SpringBoot實(shí)現(xiàn)簡(jiǎn)易支付寶網(wǎng)頁(yè)支付功能

可以看到是192.168.137.1這個(gè)地址,這和上面我那段代碼是一樣的,因此選取該IP地址即可在內(nèi)網(wǎng)進(jìn)行訪問(wèn),達(dá)到模擬的效果,支付寶掃碼時(shí)便可向SpringBoot程序發(fā)送請(qǐng)求,然后傳到支付寶端,處理請(qǐng)求后傳回html頁(yè)面,直接返回給客戶端。

到此這篇關(guān)于SpringBoot實(shí)現(xiàn)簡(jiǎn)易支付寶網(wǎng)頁(yè)支付的文章就介紹到這了,更多相關(guān)SpringBoot支付寶網(wǎng)頁(yè)支付內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://blog.csdn.net/weixin_43218670/article/details/120875730

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品999久久久 | 欧美一级特黄aaaaaaa什 | 俄罗斯16一20sex牲色另类 | 在线播放污| 国产精品嘿咻嘿咻在线播放 | 男女生羞羞视频网站在线观看 | 久久要| 久久精品一区二区三区国产主播 | 国产午夜精品一区二区三区视频 | 国产亚洲精品视频中文字幕 | 黄色一级毛片免费看 | 国产精品99久久久久久大便 | 日本在线播放一区二区三区 | 九九热在线视频观看这里只有精品 | 欧美三级短视频 | 激情在线视频 | 欧美性生交xxxxx久久久缅北 | 永久免费一区二区三区 | 国产中文一区 | china对白普通话xxxx | 久久久成人动漫 | 久久人人爽人人爽人人片av高清 | 播色网 | 久久久久久久一区二区三区 | 国产在线欧美日韩 | 97香蕉超级碰碰久久免费软件 | 欧美熟videos肥婆 | 国产一级在线免费观看 | 欧美18一19sex性护士农村 | 欧美一级成人一区二区三区 | 国产精品久久久久影院老司 | 99热久草| 9999在线视频 | 国产99久久久久久免费看农村 | 久久国产在线观看 | 亚洲精品自在在线观看 | 黄污污网站 | 99亚洲伊人久久精品影院红桃 | 国产91极品 | 在线a| 91精品国产一区二区三区动漫 |