电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Java后臺實現(xiàn)微信支付和微信退款

瀏覽:163日期:2022-05-30 16:37:23

微信支付流程

都是我自己工作中開發(fā)的,親測可用,不喜勿噴。

controller中我是這么寫的,你們需要根據(jù)自己的業(yè)務(wù)需求改動。ResponseBean是我自己封裝的,你們可以改成你們想要的形式。

/** * 微信統(tǒng)一下單接口 * @return */ @RequestMapping(value = '/doUnifiedOrder', method = RequestMethod.POST) public ResponseBean doUnifiedOrder(@RequestBody Map<String,Object> req) { Map resultMap=new HashMap(); String openid = (String) req.get('openId'); WXPay wxpay =null; try { //初始化證書 myConfig.initCert(); wxpay= new WXPay(myConfig); } catch (Exception e) { e.printStackTrace(); } //生成的隨機(jī)字符串 String nonce_str = WXPayUtil.generateNonceStr(); //獲取客戶端的ip地址 //獲取本機(jī)的ip地址 InetAddress addr = null; try { addr = InetAddress.getLocalHost(); } catch (UnknownHostException e) { e.printStackTrace(); } //支付金額,需要轉(zhuǎn)成字符串類型,否則后面的簽名會失敗 String payOutMoney = WxMoney.changeY2F(String.valueOf(req.get('money'))); String tradeName = (String) req.get('tradeName'); if(tradeName!=null&&tradeName.length()>0){ }else{ tradeName = '課程支付'; } String body = tradeName; //商戶訂單號 String out_trade_no= WXPayUtil.generateNonceStr(); //統(tǒng)一下單接口參數(shù) HashMap<String, String> data = new HashMap<String, String>(); data.put('appid', 你的appid); data.put('mch_id', 商戶id); data.put('nonce_str', nonce_str); data.put('body', body); data.put('out_trade_no',out_trade_no); data.put('total_fee', payOutMoney); data.put('spbill_create_ip', '127.0.0.1'); data.put('notify_url', 回調(diào)地址); data.put('trade_type','JSAPI'); data.put('openid', openid); try { Map<String, String> rMap = wxpay.unifiedOrder(data); String return_code = (String) rMap.get('return_code'); String result_code = (String) rMap.get('result_code'); String nonceStr = WXPayUtil.generateNonceStr(); resultMap.put('nonceStr', nonceStr); Long timeStamp = System.currentTimeMillis() / 1000; if ('SUCCESS'.equals(return_code) && return_code.equals(result_code)) { String prepayid = rMap.get('prepay_id'); resultMap.put('package', 'prepay_id='+prepayid); resultMap.put('signType', 'MD5'); //這邊要將返回的時間戳轉(zhuǎn)化成字符串,不然小程序端調(diào)用wx.requestPayment方法會報簽名錯誤 resultMap.put('timeStamp', timeStamp + ''); //再次簽名,這個簽名用于小程序端調(diào)用wx.requesetPayment方法 resultMap.put('appId',myConfig.getAppID()); String sign = WXPayUtil.generateSignature(resultMap, myConfig.getKey()); resultMap.put('paySign', sign); resultMap.put('out_trade_no',out_trade_no); ResponseBean responseBean = new ResponseBean(HttpStatus.OK.value(),'微信支付',resultMap); return responseBean; }else{ResponseBean responseBean = new ResponseBean(HttpStatus.OK.value(),'微信支付失敗','微信支付失敗');return responseBean; } } catch (Exception e) { ResponseBean responseBean = new ResponseBean(HttpStatus.OK.value(),'微信支付失敗','微信支付失敗'); e.printStackTrace(); return responseBean; } }

微信退款代碼(需要傳退款的訂單id)

public ResponseBean refund(Map<String, Object> req) { Map resultMap=new HashMap(); String buyId = (String) req.get('buyId'); WXPay wxpay =null; try { myConfig.initCert();//初始化證書 wxpay= new WXPay(myConfig); } catch (Exception e) { e.printStackTrace(); } //生成的隨機(jī)字符串 String nonce_str = WXPayUtil.generateNonceStr(); //獲取客戶端的ip地址 //獲取本機(jī)的ip地址 InetAddress addr = null; try { addr = InetAddress.getLocalHost(); } catch (UnknownHostException e) { e.printStackTrace(); } //支付金額,需要轉(zhuǎn)成字符串類型,否則后面的簽名會失敗// int total_fee= (int) req.get('money'); String payOutMoney = WxMoney.changeY2F(String.valueOf(req.get('money')));// String body = (String) req.get('z'); //商戶訂單號 String out_trade_no= WXPayUtil.generateNonceStr(); //統(tǒng)一下單接口參數(shù) HashMap<String, String> data = new HashMap<String, String>(); try { data.put('appid', myConfig.getAppID()); data.put('mch_id', myConfig.getMchID()); data.put('nonce_str', nonce_str); data.put('sign_type', 'MD5'); data.put('out_trade_no',buyId);//微信訂單號 data.put('out_refund_no', out_trade_no);//商戶退款單號 data.put('total_fee',payOutMoney);//支付金額,微信支付提交的金額是不能帶小數(shù)點的,且是以分為單位,這邊需要轉(zhuǎn)成字符串類型,否則后面的簽名會失敗 data.put('refund_fee',payOutMoney);//退款總金額,訂單總金額,單位為分,只能為整數(shù) //MD5運算生成簽名,這里是第一次簽名,用于調(diào)用統(tǒng)一下單接口 String sign = WXPayUtil.generateSignature(data, myConfig.getKey()); data.put('sign', sign); Map<String, String> rMap = wxpay.refund(data); String return_code = (String) rMap.get('return_code'); String result_code = (String) rMap.get('result_code'); Long timeStamp = System.currentTimeMillis() / 1000; if ('SUCCESS'.equals(return_code) && return_code.equals(result_code)) {ResponseBean responseBean = new ResponseBean(HttpStatus.OK.value(),'微信退款成功',rMap);return responseBean; }else{ResponseBean responseBean = new ResponseBean(HttpStatus.OK.value(),'微信退款失敗','微信支付失敗');return responseBean; } } catch (Exception e) { ResponseBean responseBean = new ResponseBean(HttpStatus.OK.value(),'微信退款失敗','微信支付失敗'); e.printStackTrace(); return responseBean; } }

需要用到的工具類

Java后臺實現(xiàn)微信支付和微信退款

然后在MyConfig中配置一下你們的小程序參數(shù)就行了,如果需要添加退款功能必須配置商戶證書(對應(yīng)在你項目中的位置)。不需要的話就把initCert方法去掉。

public class MyConfig extends WXPayConfig { @Value('${res.imgPath}') public String imgPath; private byte[] certData; @Override public String getAppID() { return '你的小程序id'; } @Override public String getMchID() { return '商戶id'; } @Override public String getKey() { return '商戶秘鑰'; } @Override public InputStream getCertStream() { ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData); return certBis; } @Override public int getHttpConnectTimeoutMs() { return 8000; } @Override public int getHttpReadTimeoutMs() { return 10000; } @Override IWXPayDomain getWXPayDomain() { return new IWXPayDomain() { @Override public void report(String domain, long elapsedTimeMillis, Exception ex) { } @Override public DomainInfo getDomain(WXPayConfig config) {return new DomainInfo('api.mch.weixin.qq.com', false); } }; } @Override public void initCert() throws Exception { String certPath = this.imgPath+'/upload/cert/'+'apiclient_cert.p12';//從微信商戶平臺下載的安全證書存放的目錄 System.out.println(certPath); File file = new File(certPath); InputStream certStream = new FileInputStream(file); this.certData = new byte[(int) file.length()]; certStream.read(this.certData); certStream.close(); }}

到此這篇關(guān)于Java后臺實現(xiàn)微信支付和微信退款的文章就介紹到這了,更多相關(guān)Java 微信支付和微信退款內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: 微信
相關(guān)文章:
主站蜘蛛池模板: 深圳VI设计-画册设计-LOGO设计-包装设计-品牌策划公司-[智睿画册设计公司] | 淘剧影院_海量最新电视剧,免费高清电影随心观看 | 深圳激光打标机_激光打标机_激光焊接机_激光切割机_同体激光打标机-深圳市创想激光科技有限公司 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 高温高压釜(氢化反应釜)百科| 南京租车,南京汽车租赁,南京包车,南京会议租车-南京七熹租车 | SMC-ASCO-CKD气缸-FESTO-MAC电磁阀-上海天筹自动化设备官网 | 冷油器-冷油器换管改造-连云港灵动列管式冷油器生产厂家 | 圆盘鞋底注塑机_连帮鞋底成型注塑机-温州天钢机械有限公司 | 福建成考网-福建成人高考网| 煤矿人员精确定位系统_矿用无线通信系统_煤矿广播系统 | 防弹玻璃厂家_防爆炸玻璃_电磁屏蔽玻璃-四川大硅特玻科技有限公司 | 全钢实验台,实验室工作台厂家-无锡市辰之航装饰材料有限公司 | KBX-220倾斜开关|KBW-220P/L跑偏开关|拉绳开关|DHJY-I隔爆打滑开关|溜槽堵塞开关|欠速开关|声光报警器-山东卓信有限公司 | 锂辉石检测仪器,水泥成分快速分析仪-湘潭宇科分析仪器有限公司 | 贵阳用友软件,贵州财务软件,贵阳ERP软件_贵州优智信息技术有限公司 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 浙江工业冷却塔-菱电冷却塔厂家 - 浙江菱电冷却设备有限公司 | sus630/303cu不锈钢棒,440C/430F/17-4ph不锈钢研磨棒-江苏德镍金属科技有限公司 | 东莞画册设计_logo/vi设计_品牌包装设计 - 华略品牌设计公司 | 新车测评网_网罗汽车评测资讯_汽车评测门户报道 | SOUNDWELL 编码器|电位器|旋转编码器|可调电位器|编码开关厂家-广东升威电子制品有限公司 | 厦门网站建设_厦门网站设计_小程序开发_网站制作公司【麦格科技】 | 防潮防水通风密闭门源头实力厂家 - 北京酷思帝克门窗 | 海外仓系统|国际货代系统|退货换标系统|WMS仓储系统|海豚云 | 电主轴-高速精密电主轴-高速电机厂家-瑞德沃斯品牌有限公司 | 河南新乡德诚生产厂家主营震动筛,振动筛设备,筛机,塑料震动筛选机 | 拖链电缆_柔性电缆_伺服电缆_坦克链电缆-深圳市顺电工业电缆有限公司 | 厚壁钢管-厚壁无缝钢管-小口径厚壁钢管-大口径厚壁钢管 - 聊城宽达钢管有限公司 | 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 东莞市海宝机械有限公司-不锈钢分选机-硅胶橡胶-生活垃圾-涡电流-静电-金属-矿石分选机 | 脱硝喷枪-氨水喷枪-尿素喷枪-河北思凯淋环保科技有限公司 | 太平洋亲子网_健康育儿 品质生活| 智能垃圾箱|垃圾房|垃圾分类亭|垃圾分类箱专业生产厂家定做-宿迁市传宇环保设备有限公司 | 超声波流量计_流量标准装置生产厂家 _河南盛天精密测控 | 南京欧陆电气股份有限公司-风力发电机官网 | 家德利门业,家居安全门,别墅大门 - 安徽家德利门业有限公司 | 杭州月嫂技术培训服务公司-催乳师培训中心报名费用-产后康复师培训机构-杭州优贝姆健康管理有限公司 | 上海小程序开发-小程序制作-上海小程序定制开发公司-微信商城小程序-上海咏熠 | 细石混凝土泵_厂家_价格-烟台九达机械有限公司 | 福兰德PVC地板|PVC塑胶地板|PVC运动地板|PVC商用地板-中国弹性地板系统专业解决方案领先供应商! 福建成考网-福建成人高考网 | 山东信蓝建设有限公司官网 |