日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ssm 微信扫码支付

發(fā)布時間:2024/3/13 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ssm 微信扫码支付 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

導(dǎo)入JAR包

12345 // https://mvnrepository.com/artifact/com.google.zxing/javasecompile group: 'com.google.zxing', name: 'javase', version: '3.1.0'// https://mvnrepository.com/artifact/com.github.wxpay/wxpay-sdkcompile group: 'com.github.wxpay', name: 'wxpay-sdk', version: '0.0.3'

建立常量配置

12345678910111213141516171819202122232425262728293031323334353637383940 package com.shop.constant;/*** @author 陽十三* @email wdful165177@gmail.com* @blog http://www.item1024.com* @date 2017/9/12* 支付常量*/public class PayConstant {//支付方式/**** 微信支付*/public final static int WEPAY=1;// 微信支付/**** 支付寶支付*/public final static int ALPAY=2;/*** 銀聯(lián)支付*/public final static int unionpay=3;//微信商戶相關(guān)資料public final static String APP_ID = " ";public final static String APP_SECRET = " ";public final static String MCH_ID = " ";public final static String API_KEY = " ";//微信接口資料public final static String NOTIFY_URL = " "; //支付結(jié)果異步回調(diào)地址public final static String TRADE_TYPE = "NATIVE";//選擇NAVITE那么上傳的ip就可以是發(fā)機支付的本機ippublic final static String API_URL = " ";public final static String CREATE_IP="127.0.0.1"; //本季ippublic final static String UFDODER_URL="https://api.mch.weixin.qq.com/pay/unifiedorder"; //微信下單接口public final static String QUERY_URL="https://api.mch.weixin.qq.com/pay/orderquery"; //微信查詢接口public final static String REFUND_URL="https://api.mch.weixin.qq.com/secapi/pay/refund"; //申請退款的接口}

支付配置文件

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 package com.shop.constant;import com.github.wxpay.sdk.WXPayConfig;import java.io.ByteArrayInputStream;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import static com.shop.constant.PayConstant.API_KEY;import static com.shop.constant.PayConstant.APP_ID;import static com.shop.constant.PayConstant.MCH_ID;/*** @author 陽十三* @email wdful165177@gmail.com* @blog http://www.item1024.com* @date 2017/9/13*/public class WxPayConfig implements WXPayConfig {private byte[] certData;//初始化退款、撤銷時的商戶證書public WxPayConfig() throws Exception {String certPath = "/Users/mac/IdeaProjects/GShop/src/main/resources/pay/cert/apiclient_cert.p12";File file = new File(certPath);InputStream certStream = new FileInputStream(file);this.certData = new byte[(int) file.length()];certStream.read(this.certData);certStream.close();}public String getAppID() {return APP_ID;}/** 微信支付商戶號 */public String getMchID() {return MCH_ID;}public String getKey() {return API_KEY;}public int getHttpConnectTimeoutMs() {return 8000;}public int getHttpReadTimeoutMs() {return 10000;}@Overridepublic InputStream getCertStream() {ByteArrayInputStream certBis;certBis = new ByteArrayInputStream(this.certData);return certBis;}}

編寫service

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 package com.shop.service;import com.shop.annotation.DataSource;import org.springframework.transaction.annotation.Isolation;import org.springframework.transaction.annotation.Transactional;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.util.Map;/*** @author 陽十三* @email wdful165177@gmail.com* @blog http://www.item1024.com* @date 2017/9/12*/@Transactional(rollbackFor=Exception.class,isolation = Isolation.REPEATABLE_READ)public interface WxPayService {/*** 下單接口* @param out_trade_no 商戶系統(tǒng)內(nèi)部訂單號,要求32個字符內(nèi),只能是數(shù)字、大小寫字母_-|*@ ,且在同一個商戶號下唯一。* @param total_fee 訂單總金額,單位為分,只能為整數(shù)* @param userId 用戶id* @param productId 商品id* @return 二維碼短鏈接*/@DataSource("write")String wxPayByQrcode(String out_trade_no,String total_fee,String productId,int userId) throws Exception;/**** @param out_trade_no 商戶系統(tǒng)內(nèi)部訂單號,要求32個字符內(nèi),只能是數(shù)字、大小寫字母_-|*@ ,且在同一個商戶號下唯一。* @param total_fee 訂單總金額,單位為分,只能為整數(shù)* @param out_refund_no 商戶系統(tǒng)內(nèi)部的退款單號,商戶系統(tǒng)內(nèi)部唯一,只能是數(shù)字、大小寫字母_-|*@ ,同一退款單號多次請求只退一筆。* @param refund_fee 退款總金額,訂單總金額,單位為分,只能為整數(shù)* @return String*/@DataSource("write")String wxPayRefund(String out_trade_no,String total_fee,String out_refund_no,String refund_fee) throws Exception;/*** 支付回調(diào)接口* @param request* @param response*/@DataSource("write")void wxPayNotify(HttpServletRequest request, HttpServletResponse response) throws Exception;/*** 訂單查詢接口*/Map<String,String> wxPayQuery(String out_trade_no) throws Exception;}

編寫實現(xiàn)類 impl

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 package com.shop.service.Impl;import com.github.wxpay.sdk.WXPay;import com.github.wxpay.sdk.WXPayUtil;import com.google.zxing.BarcodeFormat;import com.google.zxing.EncodeHintType;import com.google.zxing.MultiFormatWriter;import com.google.zxing.common.BitMatrix;import com.shop.constant.WxPayConfig;import com.shop.mapper.*;import com.shop.pojo.IntegralLog;import com.shop.pojo.Orders;import com.shop.pojo.SystemOption;import com.shop.pojo.UserPayList;import com.shop.service.UserPayListService;import com.shop.service.WxPayService;import com.shop.utils.WxPayUtils;import com.shop.utils.XmlUtils;import org.jdom2.JDOMException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Repository;import org.springframework.stereotype.Service;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.*;import java.util.concurrent.TimeUnit;import static com.shop.constant.PayConstant.*;/*** @author 陽十三* @email wdful165177@gmail.com* @blog http://www.item1024.com* @date 2017/9/12*/@Servicepublic class WxPayServiceImpl implements WxPayService {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Resourceprivate UserPayListMapper userPayListMapper;private WxPayConfig wxPayConfig;private WXPay wxPay;@Resourceprivate OrdersMapper ordersMapper;@Resourceprivate UserInfoMapper userInfoMapper;@Resourceprivate SystemOptionMapper systemOptionMapper;@Resourceprivate IntegralLogMapper integralLogMapper;/*** @param out_trade_no 商戶訂單號* @param total_fee 標(biāo)價金額* @param userId 用戶id* @param productId 商品id* @return 微信支付所需的二維碼生成的 短鏈接*/@Overridepublic String wxPayByQrcode(String out_trade_no, String total_fee, String productId, int userId) throws Exception {System.out.println("Wxpay start");//防止請求二維碼的時候訂單號會重復(fù)if (redisTemplate.hasKey(out_trade_no)) {System.out.println("Wxpay二維碼存在 返回緩存的二維碼");return redisTemplate.opsForValue().get(out_trade_no);}UserPayList userPayList = new UserPayList();userPayList.setOrderId((out_trade_no));userPayList.setPayAmount(Double.valueOf(total_fee) / 100);userPayList.setPayType(WEPAY);userPayList.setPayCreatetime(new java.sql.Date(System.currentTimeMillis()));userPayList.setUserId(userId);userPayList.setpStatus(0);String code_url = "訂單重復(fù)了";wxPayConfig = new WxPayConfig();wxPay = new WXPay(wxPayConfig);String currTime = WxPayUtils.getCurrTime();String strTime = currTime.substring(8, currTime.length());String strRandom = WxPayUtils.buildRandom(4) + "";String nonce_str = strTime + strRandom;//設(shè)置請求參數(shù)Map<String, String> data = new HashMap<String, String>();data.put("body", "奧農(nóng)匯");data.put("out_trade_no", out_trade_no);data.put("nonce_str", nonce_str);data.put("fee_type", "CNY");data.put("total_fee", total_fee);data.put("spbill_create_ip", CREATE_IP);data.put("notify_url", NOTIFY_URL);data.put("trade_type", TRADE_TYPE); // 此處指定為掃碼支付data.put("product_id", productId);try {//發(fā)起支付Map<String, String> resp = wxPay.unifiedOrder(data);System.out.println(resp);if (resp.get("result_code").equals("SUCCESS")) {//獲取二維碼URLcode_url = resp.get("code_url");userPayListMapper.insertSelective(userPayList);//存入redis 防止二次請求重復(fù)redisTemplate.opsForValue().set(out_trade_no, code_url);//設(shè)置半個小時二維碼過期redisTemplate.expire(out_trade_no, 15, TimeUnit.MINUTES);}} catch (Exception e) {e.printStackTrace();}return code_url;}@Overridepublic String wxPayRefund(String out_trade_no, String total_fee, String out_refund_no, String refund_fee) throws Exception {//設(shè)置請求參數(shù)String flag = "FAIL";HashMap<String, String> data = new HashMap<String, String>();wxPayConfig = new WxPayConfig();wxPay = new WXPay(wxPayConfig);data.put("out_trade_no", out_trade_no);data.put("out_refund_no", out_refund_no);data.put("total_fee", total_fee);data.put("refund_fee", refund_fee);data.put("refund_fee_type", "CNY");try {//調(diào)用sdk發(fā)起退款Map<String, String> result = wxPay.refund(data);System.out.println(result);if ("SUCCESS".equals(result.get("result_code"))) {//TODO:更新訂單System.out.println("訂單" + result.get("out_trade_no") + "微信退款成功");try {ordersMapper.updateStaByOrderIdAndSta(result.get("out_trade_no"), 8, 6);flag = "SUCCESS";} catch (Exception e) {e.getStackTrace();}}} catch (Exception e) {e.printStackTrace();}return flag;}@Overridepublic void wxPayNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {// 讀取回調(diào)內(nèi)容InputStream inputStream;StringBuffer sb = new StringBuffer();inputStream = request.getInputStream();String s;BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));while ((s = in.readLine()) != null) {sb.append(s);}in.close();inputStream.close();// 支付結(jié)果通知的xml格式數(shù)據(jù)String notifyData = sb.toString();// 轉(zhuǎn)換成mapMap<String, String> notifyMap = WXPayUtil.xmlToMap(notifyData);//支付確認(rèn)內(nèi)容String resXml = "";wxPayConfig = new WxPayConfig();wxPay = new WXPay(wxPayConfig);//驗證簽名if (wxPay.isPayResultNotifySignatureValid(notifyMap)) { // 簽名正確if (notifyMap.get("out_trade_no") != null) {if ("SUCCESS".equals(notifyMap.get("result_code"))) { //交易成功// TODO:更新訂單System.out.println("訂單" + notifyMap.get("out_trade_no") + "微信支付成功");try {//更改訂單狀態(tài)ordersMapper.updateStaByOrderIdAndSta(notifyMap.get("out_trade_no"), 1, 2);//更改支付記錄表狀態(tài)userPayListMapper.updateStaByOrderIdAndSta(notifyMap.get("out_trade_no"), 0, 1);//增加用戶積分int userid = userPayListMapper.selectUserIdByOrderId(notifyMap.get("out_trade_no"));//獲取積分規(guī)則SystemOption systemOption = systemOptionMapper.selectByPrimaryKey(1);Double amount = Double.parseDouble(notifyMap.get("total_fee")) / 100 / systemOption.getIntegralMinusrule();userInfoMapper.updateAmountByUserIdInc(amount, userid);//積分日志IntegralLog integralLog = new IntegralLog();integralLog.setIntegralChangenum(amount);integralLog.setIntegralChangereason("購買商品");integralLog.setIntegralChangetime(new Date(System.currentTimeMillis()));integralLog.setIntegralChangetype(1);integralLog.setIntegralRestnum(0.00);integralLogMapper.insertSelective(integralLog);//設(shè)置成功確認(rèn)內(nèi)容resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>" + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";} catch (Exception e) {System.out.println("更改訂單狀態(tài)異常");e.getStackTrace();}} else { //交易失敗try {ordersMapper.updateStaByOrderIdAndSta(notifyMap.get("out_trade_no"), null, 7);} catch (Exception e) {e.getStackTrace();}resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg></return_msg>" + "</xml> ";System.out.println("訂單" + notifyMap.get("out_trade_no") + "微信支付失敗");}}// 注意特殊情況:訂單已經(jīng)退款,但收到了支付結(jié)果成功的通知,不應(yīng)把商戶側(cè)訂單狀態(tài)從退款改成支付成功} else { // 簽名錯誤,如果數(shù)據(jù)里沒有sign字段,也認(rèn)為是簽名錯誤//設(shè)置失敗確認(rèn)內(nèi)容resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg></return_msg>" + "</xml> ";System.out.println("訂單" + notifyMap.get("out_trade_no") + "微信支付失敗");}//發(fā)送通知response.getWriter().println(resXml);}/**** @param out_trade_no 訂單號* @return* @throws Exception*/@Overridepublic Map<String, String> wxPayQuery(String out_trade_no) throws Exception {HashMap<String, String> data = new HashMap<String, String>();Map<String, String> result = new HashMap<>();wxPayConfig = new WxPayConfig();wxPay = new WXPay(wxPayConfig);data.put("out_trade_no", out_trade_no);try {//調(diào)用sdk發(fā)起退款result = wxPay.orderQuery(data);}catch (Exception e){e.getStackTrace();}return result;}}

控制器編寫

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 package com.shop.controller;import com.google.zxing.BarcodeFormat;import com.google.zxing.EncodeHintType;import com.google.zxing.MultiFormatWriter;import com.google.zxing.client.j2se.MatrixToImageWriter;import com.google.zxing.common.BitMatrix;import com.shop.service.WxPayService;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.OutputStream;import java.util.HashMap;import java.util.Map;/*** @author 陽十三* @email wdful165177@gmail.com* @blog http://www.item1024.com* @date 2017/9/12* 系統(tǒng)支付控制器*/@Controller@RequestMapping(value = "/Pay")public class PayController {@Resourceprivate WxPayService wxPayService;@RequestMapping("/wxPayByQrcode.py")@ResponseBodypublic void orderPay(HttpServletRequest request, HttpServletResponse response) throws Exception {String code_url = wxPayService.wxPayByQrcode("20150806125377", "1", "18", 59);System.out.println(code_url);//根據(jù)url生成二維碼MultiFormatWriter multiFormatWriter = new MultiFormatWriter();// 設(shè)置二維碼參數(shù)Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");BitMatrix bitMatrix = multiFormatWriter.encode(code_url, BarcodeFormat.QR_CODE, 300, 300, hints);//返回二維碼MatrixToImageWriter.writeToStream(bitMatrix, "jpg", response.getOutputStream());}@RequestMapping("wxPayNotify")@ResponseBodypublic void wxPayNotify(HttpServletRequest request,HttpServletResponse response) throws Exception {wxPayService.wxPayNotify(request,response);}}

下單 退款測試

123456 @Testpublic void wxPayRund() throws Exception {String str = wxPayService.wxPayRefund("20150806125377","1","","1");System.out.println(str);}

總結(jié)

以上是生活随笔為你收集整理的ssm 微信扫码支付的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。