摘要:最近的一個項目中涉及到了支付業務,其中用到了微信支付和支付寶支付,在作的過程當中也遇到些問題,因此如今總結梳理一下,分享給有須要的人,也爲本身之後回顧留個思路。php
一:微信支付接入準備工做:html
首先,微信支付,只支持企業用戶,我的用戶是不能接入微信支付的,因此要想接入微信支付,首先須要有微信公衆號,這個的企業才能申請。有了微信公衆號,就能申請微信支付的相關內容,因此在準備開始寫代碼以前須要先把下面的這些參數申請好:公衆帳號ID、微信支付商戶號、API密鑰、AppSecret是APPID對應的接口密碼、回調地址(回調必須保證外網能訪問到此地址)、發起請求的電腦IPjava
二:微信支付流程說明:git
有了上面提到的這些參數,那咱們就能夠接入微信支付了,下面我來看下微信支付的官方文檔(https://pay.weixin.qq.com/wiki/doc/api/index.html)、訪問該地址能夠看到有多種支付方式能夠選擇,咱們這裏選擇掃碼支付的方式(https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1)web
這裏咱們選擇模式二,下面看下模式二的時序圖,以下圖:spring
模式二與模式一相比,流程更爲簡單,不依賴設置的回調支付URL。商戶後臺系統先調用微信支付的統一下單接口,微信後臺系統返回連接參數code_url,商戶後臺系統將code_url值生成二維碼圖片,用戶使用微信客戶端掃碼後發起支付。注意:code_url有效期爲2小時,過時後掃碼不能再發起支付。api
業務流程說明:安全
(1)商戶後臺系統根據用戶選購的商品生成訂單。springboot
(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。