七 SpringCloud - 微信支付

1、開發文檔微信開發文檔:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

七 SpringCloud - 微信支付

文章插圖
安全規范:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
1、簽名算法(簽名校驗工具)簽名生成的通用步驟如下:第一步,設所有發送或者接收到的數據為集合M,將集合M內非空參數值的參數按照參數名ASCII碼從小到大排序(字典序),使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串stringA 。特別注意以下重要規則:◆ 參數名ASCII碼從小到大排序(字典序);◆ 如果參數的值為空不參與簽名;◆ 參數名區分大小寫;◆ 驗證調用返回或微信主動通知簽名時,傳送的sign參數不參與簽名 , 將生成的簽名與該sign值作校驗 ?!?微信接口可能增加字段,驗證簽名時必須支持增加的擴展字段第二步,在stringA最后拼接上key得到stringSignTemp字符串,并對stringSignTemp進行MD5運算,再將得到的字符串所有字符轉換為大寫,得到sign值signValue 。注意:密鑰的長度為32個字節 。2、配置信息 和 工具類2.1 核心配置文件application.yml
#端口server:port: 8096#微信支付自定義配置參數wechat:pay:app-id: xxxx # 公眾賬號IDmch-id: xxxx # 商戶號IDmch-key: xxxxx # 商戶密鑰order-uri: https://api.mch.weixin.qq.com/pay/unifiedorder # 請求微信支付接口統一下單地址notify-uri: http://xxxxx.natappfree.cc/wxpay/notifyresult # 微信支付結果回調地址view-order-status-uri: https://api.mch.weixin.qq.com/pay/orderquery#查詢訂單狀態地址注意:其中的回調地址,需要內網穿透;
2.2 自定義配置類/** * Created On : 3/11/2022. * <p> * Author : huayu * <p> * Description: 自定義配置類 */@Data@Component@ConfigurationProperties(prefix = "wechat.pay")public class WechatPayConfig {/*公眾賬號ID*/private String appId;/*商戶號ID*/private String mchId;/*商戶密鑰*/privateString mchKey;/*請求微信支付接口統一下單地址*/private String orderUri;/*微信支付結果回調地址*/private String notifyUri;/*主動查詢訂單狀態地址*/private String viewOrderStatusUri;}2.3 常量類/** * Created On : 3/11/2022. * <p> * Author : huayu * <p> * Description: 微信支付常量類 */public class WechatPayConstant {//系統交易訂單號的淺醉標識符public static final String WECHAT_PAY_TRADE_ORDER_PREFIX ="kh";//系統格式化日期字符串 , 到秒public static final String WECHAT_PAY_TIME_PATTERN_ALL = "yyyyMMddHHmmss";//系統格式化日期字符串,到天public static final String WECHAT_PAY_TIME_PATTERN_DAY = "yyyyMMdd";//微信支付的交易類型:naivepublic static final String WECHAT_PAY_TRADE_NATIVE = "NATIVE";//微信支付的簽名方式MD5public static final String WECHAT_PAY_SIGN_TYPE_MD5= "MD5";//微信支付的簽名參數名public static final String WECHAT_PAY_FIELD_SIGN = "sign";//微信支付下單請求的字符集編碼public static final String WECHAT_PAY_ENCODING_UTF8="UTF-8";//微信支付下單結果的成功狀態碼public static final String WECHAT_PAY_RESULT_SUCCESS = "SUCCESS";//微信支付結果異步回調的同步響應,成功public static final String WECHAT_PAY_NOTIFY_SUCCESS="<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";//微信支付結果異步回調的同步響應,失敗public static final String WECHAT_PAY_NOTIFY_FALL="<xml><return_code><![CDATA[FALL]]></return_code><return_msg><![CDATA[NOOK]]></return_msg></xml>";//訂單查詢 結果成功的狀態碼public static final String WECHAT_PAY_VIEW_ORDER_STATUS_SUCCESS = "SUCCESS";}2.4 工具類WechatPayUtil 和 WechatPayXmlUtil :https://www.cnblogs.com/xiaoqigui/p/16855921.html
HttpClient4Util http請求工具類:https://www.cnblogs.com/xiaoqigui/p/16839536.html
3、請求微信統一下單接口,下單支付訂單 , 返回支付鏈接
  1. 獲取參數,放進map集合中并按key值,字典排序 。
  2. 通過參數生成簽名(生成的簽名也放進map集合) 。
  3. 將map集合轉成xml字符串 。
  4. 獲取微信支付統一下單地址,xml參數字符串作為參數發送請求 。
  5. 返回支付的鏈接(可以生成二維碼給用戶掃碼支付) 。
3.0 參數列表
七 SpringCloud - 微信支付

文章插圖
3.1 接口/** * Created On : 3/11/2022. * <p> * Author : huayu * <p> * Description: 微信支付業務接口 */public interface WechatPayService {/*** @author : huayu* @date: 3/11/2022* @param: []* @return : java.lang.String* @description : 生成請求微信支付接口的統一下單接口參數 ,返回xml格式字符串*/String generateWxUnifyOrderXmlParams(String productBody,int totalFee) throws Exception;/*** @author : huayu* @date: 3/11/2022* @param: [unifyOrderXmlParams]* @return : java.util.Map<java.lang.String,java.lang.String>* @description : 請求微信支付統一下單*/Map<String,String> getWchatPayUnifyOrderResult(String unifyOrderXmlParams) throws Exception;}

推薦閱讀