摘要:最近的一個項目中涉及到了支付業務,其中用到了微信支付和支付寶支付,在做的過程中也遇到些問題,所以現在總結梳理一下,分享給有需要的人,也為自己以后回顧留個思路。
一:微信支付接入准備工作:
首先,微信支付,只支持企業用戶,個人用戶是不能接入微信支付的,所以要想接入微信支付,首先需要有微信公眾號,這個的企業才能申請。有了微信公眾號,就能申請微信支付的相關內容,所以在准備開始寫代碼之前需要先把下面的這些參數申請好:公眾賬號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。