Java 後端微信支付demo
一、匯入微信SDK
二、在微信商戶平臺下載證照放在專案的resources目錄下的cert資料夾下(cert資料夾需要自己建)
三、實現微信的WXPayConfig介面
package com.ieou.demo.common;
import com.github.wxpay.sdk.WXPayConfig;
import org.apache.commons.io.IOUtils;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
/** 配置我們自己的資訊 */
public class OurWxPayConfig implements WXPayConfig {
/** 載入證照 這裡證照需要到微信商戶平臺進行下載*/
private byte [] certData;
public OurWxPayConfig() throws Exception{
InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("cert/wxpay/apiclient_cert.p12");
this.certData = IOUtils.toByteArray(certStream);
certStream.close();
}
/** 設定我們自己的appid
* 商戶號
* 祕鑰
* */
@Override
public String getAppID() {
return "wx7494893843843c";
}
@Override
public String getMchID() {
return "4672984344";
}
@Override
public String getKey() {
return "qbH5l4N3468798dfgK";
}
@Override
public InputStream getCertStream() {
return new ByteArrayInputStream(this.certData);
}
@Override
public int getHttpConnectTimeoutMs() {
return 0;
}
@Override
public int getHttpReadTimeoutMs() {
return 0;
}
}
四、構建自己的引數
package com.ieou.demo.common;
import java.math.BigDecimal;
public class WxpayParam {
/** 微信支付的金額是String型別 並且是以分為單位
* 下面舉個例子單位是元是怎麼轉為分的
* */
BigDecimal totalPrice = new BigDecimal(1); //此時的單位是元
private String body = "xxx等商品資訊";
private String totalFee = totalPrice.multiply(new BigDecimal(100)).toBigInteger().toString();
/** 隨機數字字串*/
private String outTradeNo = "4784984230432842944";
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getTotalFee() {
return totalFee;
}
public void setTotalFee(String totalFee) {
this.totalFee = totalFee;
}
public String getOutTradeNo() {
return outTradeNo;
}
public void setOutTradeNo(String outTradeNo) {
this.outTradeNo = outTradeNo;
}
}
五、配置微信統一下單介面需要的引數,並呼叫微信統一下單介面
package com.ieou.demo.controller;
import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;
import com.ieou.demo.common.OurWxPayConfig;
import com.ieou.demo.common.WxpayParam;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/")
public class WxPayController {
@GetMapping("/pay")
public Map<String,String> wxPayFunction() throws Exception{
WxpayParam wxpayParam = new WxpayParam();
String notifyUrl = "www.baidu.com"; //我這裡的回撥地址是隨便寫的,到時候需要換成處理業務的回撥介面
OurWxPayConfig ourWxPayConfig = new OurWxPayConfig();
WXPay wxPay = new WXPay(ourWxPayConfig);
//根據微信支付api來設定
Map<String,String> data = new HashMap<>();
data.put("appid",ourWxPayConfig.getAppID());
data.put("mch_id",ourWxPayConfig.getMchID()); //商戶號
data.put("trade_type","APP"); //支付場景 APP 微信app支付 JSAPI 公眾號支付 NATIVE 掃碼支付
data.put("notify_url",notifyUrl); //回撥地址
data.put("spbill_create_ip","127.0.0.1"); //終端ip
data.put("total_fee",wxpayParam.getTotalFee()); //訂單總金額
data.put("fee_type","CNY"); //預設人民幣
data.put("out_trade_no",wxpayParam.getOutTradeNo()); //交易號
data.put("body",wxpayParam.getBody());
data.put("nonce_str","bfrhncjkfdkfd"); // 隨機字串小於32位
String s = WXPayUtil.generateSignature(data, ourWxPayConfig.getKey()); //簽名
data.put("sign",s);
/** wxPay.unifiedOrder 這個方法中呼叫微信統一下單介面 */
Map<String, String> respData = wxPay.unifiedOrder(data);
if (respData.get("return_code").equals("SUCCESS")){
//返回給APP端的引數,APP端再調起支付介面
Map<String,String> repData = new HashMap<>();
repData.put("appid",ourWxPayConfig.getAppID());
repData.put("mch_id",ourWxPayConfig.getMchID());
repData.put("prepayid",respData.get("prepay_id"));
repData.put("package","WXPay");
repData.put("noncestr",respData.get("nonce_str"));
repData.put("timestamp",String.valueOf(System.currentTimeMillis()/1000));
String sign = WXPayUtil.generateSignature(repData,ourWxPayConfig.getKey()); //簽名
respData.put("sign",sign);
respData.put("timestamp",repData.get("timestamp"));
respData.put("package","WXPay");
return respData;
}
throw new Exception(respData.get("return_msg"));
}
}
六、至此,後端程式碼已經結束,前端拿到返回值呼叫微信發起支付介面就可以了。
相關文章
- 微信app支付 java後臺接AndroidAPPJavaAndroid
- 微信公眾號開發-後端demo(隨錄)後端
- java實現沙箱測試環境支付寶支付(demo)和整合微信支付和支付寶支付到springmvc+spring+mybatis環境全過程(支付寶和微信支付、附原始碼)JavaSpringMVCMyBatis原始碼
- 微信支付(weixin-java-pay)Java
- JAVA版微信支付V3—JSAPI支付JavaJSAPI
- 微信支付,支付寶支付
- 微信支付V3 Java jsApi 掃碼支付JavaJSAPI
- Java 微信支付通知本地除錯解決辦法 Java 微信支付通知如何除錯Java除錯
- java實現掃碼槍-微信支付Java
- 支付寶、微信支付(.NET)
- 關於微信支付,支付寶支付
- 對iOS端支付寶和微信支付程式碼進行整合iOS
- 微信JSAPI支付JSAPI
- 微信App支付APP
- 支付寶微信合單支付
- pay-spring-boot 開箱即用的Java支付模組,整合支付寶支付、微信支付SpringbootJava
- 微信小程式 demo 整理微信小程式
- nodejs微信支付之掃碼支付NodeJS
- 微信、支付寶支付那點事
- PHP-Laravel支付寶支付和微信支付PHPLaravel
- 微信開發超市全反系統,微信支付刷卡支付,微信介面簡單配置!
- 比微信落後了FacebookMessenger上線移動支付Messenger
- mui 判斷手機客戶端是否安裝微信或支付寶或淘寶等,mui 獲取微信、支付寶支付通道UI客戶端
- 微信支付團隊釋出“微信青蛙pro” 支援刷臉支付功能
- 微信小程式--遊戲demo微信小程式遊戲
- Android 微信支付 微信是否安裝判斷Android
- 微信小程式之支付微信小程式
- PHP微信支付開發PHP
- 微信jsapi支付 退款介面JSAPI
- uni-app 微信支付APP
- 微信支付商戶系統架構背後的故事架構
- 關於支付寶以及微信支付的整合
- Laravel 搞定支付寶和微信掃碼支付Laravel
- android微信分享、微信支付的一些坑Android
- 微信App支付:微信支付的appid,appsecret,商戶號mch_id,微信交易支付金鑰(mch_key)在哪裡檢視APP
- laravel後端生成微信小程式海報Laravel後端微信小程式
- 整理 PC 端微信掃碼支付全過程 --- easywechat + Laravel 5.8Laravel
- 微信公眾號支付開發全過程(Java 版)Java