摘要:最近的一個項目中涉及到了支付業務,其中用到了微信支付和支付寶支付,在做的過程中也遇到些問題,所以現在總結梳理一下,分享給有需要的人,也為自己以后回顧留個思路。
一:微信支付接入准備工作:
首先,微信支付,只支持企業用戶,個人用戶是不能接入微信支付的,所以要想接入微信支付,首先需要有微信公眾號,這個的企業才能申請。有了微信公眾號,就能申請微信支付的相關內容,所以在准備開始寫代碼之前需要先把下面的這些參數申請好:公眾賬號ID、微信支付商戶號、API密鑰、AppSecret是APPID對應的接口密碼、回調地址(回調必須保證外網能訪問到此地址)、發起請求的電腦IP
二:微信支付流程說明:
有了上面提到的這些參數,那我們就可以接入微信支付了,下面我來看下微信支付的官方文檔(https://pay.weixin.qq.com/wiki/doc/api/index.html)、訪問該地址可以看到有多種支付方式可以選擇,我們這里選擇掃碼支付的方式(https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1)
這里我們選擇模式二,下面看下模式二的時序圖,如下圖:
模式二與模式一相比,流程更為簡單,不依賴設置的回調支付URL。商戶后台系統先調用微信支付的統一下單接口,微信后台系統返回鏈接參數code_url,商戶后台系統將code_url值生成二維碼圖片,用戶使用微信客戶端掃碼后發起支付。注意:code_url有效期為2小時,過期后掃碼不能再發起支付。
業務流程說明:
(1)商戶后台系統根據用戶選購的商品生成訂單。
(2)用戶確認支付后調用微信支付【統一下單API】生成預支付交易;
(3)微信支付系統收到請求后生成預支付交易單,並返回交易會話的二維碼鏈接code_url。
(4)商戶后台系統根據返回的code_url生成二維碼。
(5)用戶打開微信“掃一掃”掃描二維碼,微信客戶端將掃碼內容發送到微信支付系統。
(6)微信支付系統收到客戶端請求,驗證鏈接有效性后發起用戶支付,要求用戶授權。
(7)用戶在微信客戶端輸入密碼,確認支付后,微信客戶端提交授權。
(8)微信支付系統根據用戶授權完成支付交易。
(9)微信支付系統完成支付交易后給微信客戶端返回交易結果,並將交易結果通過短信、微信消息提示用戶。微信客戶端展示支付交易結果頁面。
(10)微信支付系統通過發送異步消息通知商戶后台系統支付結果。商戶后台系統需回復接收情況,通知微信后台系統不再發送該單的支付通知。
(11)未收到支付通知的情況,商戶后台系統調用【查詢訂單API】。
(12)商戶確認訂單已支付后給用戶發貨。
三:微信支付所需要的maven依賴:
<!--生成二維碼jar-->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.2.1</version>
</dependency>
四:微信支付調用統一下單接口的核心代碼
3.1:微信支付工具類:
HttpUtil.java
package com.micai.springboot.util.pay.wx;
public class PayConfigUtil {
//初始化
// public final static String APP_ID = "11111111111"; //公眾賬號appid(改為自己實際的)
// public final static String APP_SECRET = "";
// public final static String MCH_ID = "111111"; //商戶號(改為自己實際的)
// public final static String API_KEY = "11111111111"; //(改為自己實際的)key設置路徑:微信商戶平台(pay.weixin.qq.com)-->賬戶設置-->API安全-->密鑰設置
//統一下單
public final static String UFDODER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
// public final static String NOTIFY_URL = "http://xxxxxxx"; //微信支付回調接口,就是微信那邊收到(改為自己實際的)
// //企業向個人賬號付款的URL
// public final static String SEND_EED_PACK_URL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
//
// public final static String CREATE_IP = "113.69.246.11";//發起支付ip(改為自己實際的)
}
package com.micai.springboot.util.pay.wx;
import com.google.zxing.common.BitMatrix;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
/**
* 二維碼生產工具類
*/
public class QRUtil {
private static final int BLACK = 0xFF000000;
private static final int WHITE = 0xFFFFFFFF;
private QRUtil() {}
public static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
}
}
return image;
}
public static void writeToFile(BitMatrix matrix, String format, File file)
throws IOException {
BufferedImage image = toBufferedImage(matrix);
if (!ImageIO.write(image, format, file)) {
throw new IOException("Could not write an image of format " + format + " to " + file);
}
}
public static void writeToStream(BitMatrix matrix, String format, OutputStream stream)
throws IOException {
BufferedImage image = toBufferedImage(matrix);
if (!ImageIO.write(image, format, stream)) {
throw new IOException("Could not write an image of format " + format);
}
}
}
訪問支付url返回微信二維碼,如下圖:
使用微信的掃一掃,掃碼支付,如下圖:
微信支付回調,如下圖:
這里對於回調只是簡單輸出了日志,你可以根據自己的實際情況選擇做相應的處理,一般都是對訂單的支付狀態做更新。
六:總結:
經過上面的所以流程,相信大家都明白了微信支付的流程,這里我們對上面的流程做個總結,要想接入微信支付,必須是企業用戶才行,個人用戶不支持,所以在開始寫代碼之前,要和公司的相關負責人申請好微信支付的相關配置參數,有了這些才能進行下面的工作,這里最重要的一點就是微信支付的回調了,回調,在生產環境必須配置可以外網訪問的URL,同時域名必須是備案過的,二級域名也可以,這里我們為了方便測試,所以就使用了內網穿透工具natapp,該工具既有免費通道也有收費通道,收費通道也很便宜,如果只是測試,免費通道就夠用了,另外還有一點要注意,就是微信支付的回調,默認微信是回調好幾次的,所以會有重復回調的問題,這里留給大家一個思考,怎么防止微信的多次回調,以免影響業務,希望有興趣的小伙伴可以留言交流。以上就是微信支付(掃碼支付模式二)的全部內容了,有想要完全源代碼的小伙伴,可以加群交流,群號:715224124。






