前提條件
這是必要條件?。?!
這是必要條件?。?!
這是必要條件!?。?/font>
開通當面付,個人、企業(yè)賬號均可,個人賬號可以私聊我?guī)兔Υ_通,10分鐘就OK !!!
演示
獲取訂單點擊,然后掃碼支付
支付成功后就會響應支付成功
應用申請開通和配置
接下來介紹應用的創(chuàng)建和配置,一定要仔細哦?。。?/p>
應用創(chuàng)建
首先進入支付寶開放平臺,進入控制臺,創(chuàng)建一個應用,大概1個工作日內(nèi)就會審核
把這幾個必填項填寫,然后確認創(chuàng)建,注意名字要清晰,應用圖標要有一定的可識別性,不然不給過,應用類型選網(wǎng)頁應用
應用配置
創(chuàng)建好后,進入產(chǎn)品詳情頁面,點擊產(chǎn)品綁定,然后去綁定
選擇支付 -> 當面付[勾選] -> 綁定,另外你還可以找到花唄支付,這樣用戶掃碼時就支持花唄支付了
要確認是開通狀態(tài)哦,如果沒有開通需要開通哦,看上面的 前提條件
然后需要配置密鑰,點擊下圖中側(cè)邊欄中的 開發(fā)設置,需要配置的是 接口加簽方式(證書/密鑰)
- 接口加簽方式(證書/密鑰):配置支付寶開放平臺會引導你下載安裝密鑰生成工具,生成一個應用公鑰和應用私鑰,私鑰一定要保管好,不要泄露,保存到本地,到時候配置在服務器上,然后把應用公鑰配置在開放平臺上,就算配置完成了,支付寶就會給到你一個支付寶公鑰,接下來你一共有三個密鑰,支付寶公鑰、應用公鑰、應用私鑰,這三個一定要分清,接下來文章介紹的所需要用到的密鑰只有這三個,清一定要分清?。。?/li>
代碼開發(fā)
接下來你可以結(jié)合著官方的開發(fā)文檔看我的文章,官方文檔:https://opendocs.alipay.com/open/02ekfg?ref=api&scene=19
- 本文后端以Java的開發(fā)方式,僅供參考!
- Web前端使用原生Html+CSS+JavaScript簡單實現(xiàn),僅供參考!
- 安卓調(diào)用可以參考我這篇文章:https://myhub.blog.csdn.net/article/details/128399771
后端實例
SDK集成
首先獲取相應的SDK,SDK下載頁面(官方):https://opendocs.alipay.com/open/54/103419
我這里以Maven的方式集成,另外我集成了zxing,用于生成支付二維碼使用
<!--alipay SDK-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.35.9.ALL</version>
</dependency>
<!-- zxing -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.5.1</version>
</dependency>
Controller實例
- 生成付款二維碼,我標明了詳細的注釋,可以直接看!
- 由于涉及到公鑰、私鑰等信息,這些部分我都用了 **************來表示,
- 記得替換哦!??!
- 記得替換哦!?。?/li>
- 記得替換哦?。?!
- 替換成你自己的!??!
以下為簡單的Demo演示,一定要結(jié)合官方文檔,閱讀接入注意事項:https://opendocs.alipay.com/open/194/105322
package com.demo.pay;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.Map;
/**
* @author ThirdGoddess
* @version 1.0.0
* @time 2022/12/22 14:37
* @desc AliPay當面付Demo
*/
@RestController
@RequestMapping("pay")
public class AliPayController {
//模擬一個用戶的支付狀態(tài)
private boolean userPayState = false;
//==================================================================================================================
//這里都是固定的
//支付寶網(wǎng)關(guān)地址
private static final String SERVER_URL = "https://openapi.alipay.com/gateway.do";
//charset
private static final String CHARSET = "GBK";
//format
private static final String FORMAT = "json";
//sign type
private static final String SIGN_TYPE = "RSA2";
//==================================================================================================================
//下面這三個是需要配置的
//APPID,即創(chuàng)建應用的那個ID,在應用詳情中的左上角可以看到
private static final String APPID = "**************";
//應用私鑰,注意是應用私鑰?。?!應用私鑰!??!應用私鑰?。?!
private static final String APP_PRIVATE_KEY = "**************";
//支付寶公鑰,注意是支付寶公鑰?。?!支付寶公鑰!?。≈Ц秾毠€?。?!
private static final String ALIPAY_PUBLIC_KEY = "**************";
/**
* 獲取二維碼
* 獲取的是用戶要掃碼支付的二維碼
* 創(chuàng)建訂單,帶入自己的業(yè)務邏輯
*/
@RequestMapping(value = "/getQr", produces = MediaType.IMAGE_JPEG_VALUE)
@ResponseBody
public byte[] getQr() {
userPayState = false;
AlipayClient alipayClient = new DefaultAlipayClient(SERVER_URL, APPID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
//配置這是一個url,下圖我已經(jīng)配置好了,這個意思是當用戶成功后,支付寶那邊會調(diào)用這個地址url,他會給你傳過去一些訂單信息,
//你處理完你的業(yè)務邏輯給支付寶響應success就行,就代表這個訂單完成交易了!
//* 建議前期開發(fā)的時候加上內(nèi)網(wǎng)穿透調(diào)試,不然支付寶是沒有辦法調(diào)到你開發(fā)的接口的
request.setNotifyUrl("http://**************.com/pay/payNotification");
JSONObject bizContent = new JSONObject();
//自己生成一個訂單號,我這里直接用時間戳演示,正常情況下創(chuàng)建完訂單需要存儲到自己的業(yè)務數(shù)據(jù)庫,做記錄和支付完成后校驗
String orderNumber = "pay" + System.currentTimeMillis();
bizContent.put("out_trade_no", orderNumber);//訂單號
bizContent.put("total_amount", 0.01);//訂單金額
bizContent.put("subject", "demo");//支付主題,自己稍微定義一下
request.setBizContent(bizContent.toString());
try {
AlipayTradePrecreateResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
System.out.println("調(diào)用成功");
} else {
System.out.println("調(diào)用失敗");
}
//獲取生成的二維碼,這里是一個String字符串,即二維碼的內(nèi)容;
//然后用二維碼生成SDK生成一下二維碼,弄成圖片返回給前端就行,我這里使用Zxing生成
//其實也可以直接把這個字符串信息返回,讓前端去生成,一樣的道理,只需要關(guān)心這個二維碼的內(nèi)容就行
String qrCode = response.getQrCode();
//生成支付二維碼圖片
BufferedImage image = QrCodeUtil.createImage(qrCode);
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(image, "jpeg", out);
byte[] b = out.toByteArray();
out.write(b);
out.close();
//最終返回圖片
return b;
} catch (Exception e) {
e.printStackTrace();
System.out.println("調(diào)用失敗");
}
return null;
}
/**
* 支付完成后支付寶會請求這個回調(diào)
*/
@PostMapping("payNotification")
public String payNotification(HttpServletRequest request) {
Map<String, String> params = new HashMap<>();
Map<String, String[]> requestParams = request.getParameterMap();
for (String name : requestParams.keySet()) {
String[] values = requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
params.put(name, valueStr);
}
for (Map.Entry<String, String> entry : params.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
//==============================================================================================================
try {
//執(zhí)行驗簽,確保結(jié)果是支付寶回調(diào)的,而不是被惡意調(diào)用,一定要做這一步
boolean signVerified = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, CHARSET, SIGN_TYPE);
if (signVerified) {
//驗簽成功,繼續(xù)執(zhí)行業(yè)務邏輯
System.out.println("驗簽成功");
//再次主動查詢訂單,不要只依賴支付寶回調(diào)的結(jié)果
String orderStatus = searchOrderStatus(params.get("out_trade_no"), params.get("trade_no"));
switch (orderStatus) {
case "TRADE_SUCCESS"://交易支付成功;
case "TRADE_FINISHED": //交易結(jié)束,不可退款;
//TODO 在這里繼續(xù)執(zhí)行用戶支付成功后的業(yè)務邏輯
userPayState = true;
break;
}
return "success";
} else {
//驗簽失?。ê芸赡芙涌诒环欠ㄕ{(diào)用)
System.out.println("驗簽失敗");
return "fail";
}
} catch (AlipayApiException e) {
e.printStackTrace();
return "fail";
}
}
/**
* 封裝一個訂單查詢
*
* @param outTradeNo 商戶訂單號
* @param tradeNo 支付寶交易號。支付寶交易憑證號
* @return 訂單狀態(tài):String
* @throws AlipayApiException AlipayApiException
* @desc "WAIT_BUYER_PAY":交易創(chuàng)建,等待買家付款;"TRADE_CLOSED":未付款交易超時關(guān)閉,或支付完成后全額退款; "TRADE_SUCCESS":交易支付成功;"TRADE_FINISHED":交易結(jié)束,不可退款;
*/
private String searchOrderStatus(String outTradeNo, String tradeNo) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient(SERVER_URL, APPID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); //獲得初始化的AlipayClient
AlipayTradeQueryRequest aliRequest = new AlipayTradeQueryRequest();//創(chuàng)建API對應的request類
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", outTradeNo);
bizContent.put("trade_no", tradeNo);
aliRequest.setBizContent(bizContent.toString()); //設置業(yè)務參數(shù)
AlipayTradeQueryResponse response = alipayClient.execute(aliRequest);//通過alipayClient調(diào)用API,獲得對應的response類
JSONObject responseObject = JSONObject.parseObject(response.getBody());
JSONObject alipayTradeQueryResponse = responseObject.getJSONObject("alipay_trade_query_response");
return alipayTradeQueryResponse.getString("trade_status");
}
/**
* 前端輪詢查詢這個接口,來查詢訂單的支付狀態(tài)
*
* @return OrderStateEntity
*/
@CrossOrigin
@GetMapping("searchOrder")
public OrderStateEntity searchOrder() {
//userPayState是一個模擬值
if (userPayState) {
//用戶支付成功了
return new OrderStateEntity(200, "支付成功了");
} else {
//用戶還沒有支付
return new OrderStateEntity(201, "你還沒有支付哦");
}
}
/**
* 響應給前端的實體
*/
static class OrderStateEntity {
private int code;
private String msg;
public OrderStateEntity(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
}
用戶支付后的回調(diào)
當使用setNotifyUrl后,用戶成功支付后,會回調(diào)其設置的url,如 setNotifyUrl(“http://xxx.com/pay/payNotification”) ,那么支付寶會等待用戶支付成功后會以POST去請求 http://xxx.com/pay/payNotification 這個地址來達成回調(diào),需要響應success或者fail,只有這兩種值哦!文章來源:http://www.zghlxwxcb.cn/news/detail-781662.html
響應值 | 描述 | 異步是否重試發(fā)送 |
---|---|---|
fail | 消息獲取失敗 | 重試 |
success | 消息獲取成功 | 不重試 |
前端代碼實例
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta charset="UTF-8">
<title>支付寶當面付Demo演示</title>
<style>
* {
margin: 0 auto;
}
.root {
width: 260px;
}
.img_box {
width: 260px;
height: 260px;
background-color: #adadad;
}
button {
width: 260px;
margin-top: 12px;
}
</style>
</head>
<body>
<div class="root">
<div class="img_box"><img width="260" height="260" id="qr" src="" alt=""></div>
<button onclick="getOrderQr()">獲取訂單</button>
<div class="response" id="response"></div>
<script>
/**
* 獲取一個二維碼
*/
function getOrderQr() {
let qrImg = document.getElementById('qr');
qrImg.src = "http://**************.com/pay/getQr?time=" + new Date().getTime()
//開始輪詢查詢訂單
orderResponse()
}
let number = 1;
const responseView = document.getElementById('response')
/**
* 循環(huán)查詢訂單響應
*/
function orderResponse() {
//每2秒查詢一次支付狀態(tài)
setTimeout(function () {
//請求接口查詢支付狀態(tài)
const xhr = new XMLHttpRequest();
xhr.open('GET', "http://**************.com/pay/searchOrder", true);
xhr.send(null);
xhr.onreadystatechange = function () {
if (xhr.status === 200 && xhr.readyState === 4) {
const json = JSON.parse(xhr.responseText);
if (200 === json.code) {
//支付成功
responseView.innerText = xhr.responseText
} else {
//沒有支付,繼續(xù)下一次查詢
responseView.innerText = '第' + number + '次查詢,結(jié)果:' + xhr.responseText
number++
orderResponse()
}
}
}
}, 2000)
}
</script>
</div>
</body>
</html>
源碼
Github:https://github.com/ThirdGoddess/aliPay文章來源地址http://www.zghlxwxcb.cn/news/detail-781662.html
到了這里,關(guān)于自己個人擁有一個可以支付功能的網(wǎng)站?當然可以了!保姆級演示!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!