这篇文章主要介绍了Java开发微信Navicat支付完整版,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本内容中很多知识点来源于以下书籍资料,如果大家想对Navicat支付相关知识点系统深入的学习,可以参阅以下电子书:
- 资料名称:
- Navicat 15用户中文指南
- 资料大小:
- 3.2 MB
- navicat激活:
-
您要访问的页面不存在-404错误 - 码农之家 404
不存在的网页
网页出错,或你访问的网页不存在. 返回首页
- 没有发现你要找的页面, 经砖家仔细研究结果如下:
-
- 可能网站栏目修改,请继续搜索
- 贵玉手输入地址时可能存在键入错误
- 电信网通CDN那头接口生锈了
Java开发微信Navicat支付实例
一:准备工作
1:先去微信公众平台注册一个公众号,选择服务号
2:去微信商户平台注册一个商户号,用于收款
3:在商户号中配置对应的公众号的APPID
4:支付结果异步通知(需要重点注意)
注意:请先详细查看官方文档按步骤开发,一切以官方文档为主 微信Navicat支付官方文档
5:测试的时候一定要使用内网穿透软件,否则回调时会报错
二:开发代码
WeChatPayConfig:
public class WeChatPayConfig { //公众号APPID private String APPID = ""; //商户号KEY private String KEY = ""; //商户号ID private String MCHID = ""; //支付完成后微信回调地址,需要外网能访问要是域名,不能是127.0.0.1跟localhost private String NOTIFY_URL = ""; }
WeChatPayServcie:
public interface WeChatPayServcie { //微信支付下单 public Map<String,String> getWxpayUrl(Map<String, String> sourceMap); //订单查询 public String orderQuery(String out_trade_no); }
@Service public class WeChatPayServiceImpl implements WeChatPayServcie { /** * 微信支付请求 * @param sourceMap * @return */ public Map<String,String> getWxpayUrl(Map<String, String> sourceMap) { SortedMap<String, Object> signParams = new TreeMap<String, Object>(); String nonce_str = UUID.randomUUID().toString().trim().replaceAll("-", ""); signParams.put("appid", PayConfig.APPID); signParams.put("mch_id",PayConfig.MCHID); signParams.put("nonce_str",sourceMap.get("nonce_str")); signParams.put("product_id",sourceMap.get("prod_id")); signParams.put("body",sourceMap.get("body")); signParams.put("out_trade_no",sourceMap.get("out_trade_no")); signParams.put("total_fee",sourceMap.get("total_fee")); signParams.put("spbill_create_ip", WxUtil.getIp()); signParams.put("notify_url",PayConfig.NOTYFLY_URL); signParams.put("trade_type","NATIVE"); String sign = WxUtil.createSign(signParams,PayConfig.KEY); signParams.put("sign",sign); String xmlPackage = WxUtil.parseMapXML(signParams); Map<String, Object> resultMap = new HashMap(); try { String result = HttpUtil.post("https://api.mch.weixin.qq.com/pay/unifiedorder",xmlPackage); resultMap = WxUtil.parseXmlMap(result); } catch (Exception e) { e.printStackTrace(); } String returnCode = (String) resultMap.get("return_code"); String returnMsg = (String) resultMap.get("return_msg"); if (returnCode.equalsIgnoreCase("FAIL")) { throw new RuntimeException(returnMsg); } String result_code = (String) resultMap.get("result_code"); if (result_code.equalsIgnoreCase("FAIL")) { throw new RuntimeException(resultMap.get("err_code_des")); } String code_url = (String) resultMap.get("code_url"); Map<String,String> map = new HashMap<>(); map.put("code_url",code_url); map.put("out_trade_no",sourceMap.get("out_trade_no")); return map; } /** * 微信支付订单查询 * @param out_trade_no * @return */ public String orderQuery(String out_trade_no) { String nonce_str = UUID.randomUUID().toString().trim().replaceAll("-", ""); SortedMap<String, Object> signParams = new TreeMap<>(); signParams.put("appid", payConfig.getWeChatPorpetties().getAppId()); signParams.put("mch_id",payConfig.getWeChatPorpetties().getMchId()); signParams.put("out_trade_no",out_trade_no); signParams.put("nonce_str",nonce_str); String sign = WxUtil.createSign(signParams,payConfig.getWeChatPorpetties().getApiKey()); signParams.put("sign",sign); String xmlPackage = WxUtil.parseMapXML(signParams); Map<String, Object> resultMap = new HashMap(); try { String result = HttpUtil.post("https://api.mch.weixin.qq.com/pay/orderquery",xmlPackage); resultMap = WxUtil.parseXmlMap(result); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("渠道网络异常"); } String returnCode = (String) resultMap.get("return_code"); String returnMsg = (String) resultMap.get("return_msg"); if (returnCode.equalsIgnoreCase(PayContants.FAIL)) { throw new RuntimeException(returnMsg); } String result_code = (String) resultMap.get("result_code"); if (result_code.equalsIgnoreCase(PayContants.FAIL)) { throw new RuntimeException(resultMap.get("err_code_des")); } String trade_state = (String) resultMap.get("trade_state"); return trade_state; } }
WeChatPayController:
/** * 微信支付接口 */ @Controller public class WxPayController { @Autowired WeChatPayServcie weChatPayServcie; /** * 微信支付下单 * payID可以不用传自己生成32位以内的随机数就好,要保证不重复 * totalFee金额一定要做判断,判断这笔支付金额与数据库是否一致 */ @RequestMapping("pay") @ResponseBody public Map<String ,String> toWxpay(HttpServletRequest httpRequest,String payId, String totalFee, String body){ System.out.println("开始微信支付..."); Map<String, String> map = new HashMap<>(); String nonce_str = UUID.randomUUID().toString().trim().replaceAll("-", ""); //生成一笔支付记录 //拼接支付参数 Map<String, String> paramMap = new HashMap<>(); paramMap.put("nonce_str", nonce_str); paramMap.put("prod_id", payId); paramMap.put("body", body); paramMap.put("total_fee", totalFee); paramMap.put("out_trade_no", payId); //发送支付请求并获取返回参数与二维码,用于支付与调用查询接口 Map<String, String> returnMap = weChatPayServcie.getWxpayUrl(paramMap); httpRequest.setAttribute("out_trade_no", payId); httpRequest.setAttribute("total_fee", totalFee); //code_url就是二维码URL,可以把这个URL放到草料二维码中生成微信二维码 httpRequest.setAttribute("code_url", returnMap.get("code_url")); map.put("out_trade_no", payId); map.put("total_fee", String.valueOf(bigDecimal)); map.put("code_url", returnMap.get("code_url")); return map; } /** * 查询微信订单 * ot_trade_no是支付 */ @RequestMapping("query") @ResponseBody public Root<String> orderQuery(String out_trade_no){ return weixinPayServcie.orderQuery(queryCallbackForm.getOut_trade_no()); } /** * 微信支付回调,这个地址就是Config中的NOTYFLY_URL */ @RequestMapping("callback") public void notify_url(HttpServletRequest request, HttpServletResponse response) throws DocumentException, ServletException, IOException,Throwable { System.out.print("微信支付回调获取数据开始..."); String inputLine; String notityXml = ""; try { while ((inputLine = request.getReader().readLine()) != null) { notityXml += inputLine; } request.getReader().close(); } catch (Exception e) { WxUtil.sendXmlMessage(request,response, PayContants.FAIL); throw new RuntimeException("回调数据xml获取失败!"); } if(StringUtils.isEmpty(notityXml)){ WxUtil.sendXmlMessage(request,response, PayContants.FAIL); throw new RuntimeException("回调数据xml为空!"); } Map<String ,Object> resultMap = XMLParse.parseXmlMap(notityXml); String returnCode = (String) resultMap.get("return_code"); String returnMsg = (String) resultMap.get("return_msg"); if (returnCode.equalsIgnoreCase(PayContants.FAIL)) { WxUtil.sendXmlMessage(request,response, PayContants.FAIL); throw new RuntimeException(returnMsg); } String resultCode = (String) resultMap.get("result_code"); if (resultCode.equalsIgnoreCase(PayContants.FAIL)) { WxUtil.sendXmlMessage(request,response, PayContants.FAIL); throw new RuntimeException(resultMap.get("err_code_des")); } SortedMap<String ,Object> paramMap = new TreeMap<>(); paramMap.put("appid",resultMap.get("appid")); paramMap.put("mch_id",resultMap.get("mch_id")); paramMap.put("nonce_str",resultMap.get("nonce_str")); paramMap.put("body",resultMap.get("body")); paramMap.put("openid", resultMap.get("openid")); paramMap.put("is_subscribe",resultMap.get("is_subscribe")); paramMap.put("trade_type",resultMap.get("trade_type")); paramMap.put("bank_type",resultMap.get("bank_type")); paramMap.put("total_fee",resultMap.get("total_fee")); paramMap.put("fee_type",resultMap.get("fee_type")); paramMap.put("cash_fee",resultMap.get("cash_fee")); paramMap.put("transaction_id",resultMap.get("transaction_id")); paramMap.put("out_trade_no",resultMap.get("out_trade_no")); paramMap.put("time_end",resultMap.get("time_end")); paramMap.put("return_code",resultMap.get("return_code")); paramMap.put("return_msg",resultMap.get("return_msg")); paramMap.put("result_code",resultMap.get("result_code")); String out_trade_no = (String) resultMap.get("out_trade_no"); String sign = SignUtil.createSign(paramMap,WxPayConfig.KEY); String mySign =(String) resultMap.get("sign"); //回调一定要验证签名以防数据被篡改 if(sign.equals(mySign)){ System.out.println("回调签名验证成功!"); //修改业务逻辑,将那笔支付状态改为已支付 } WxUtil.sendXmlMessage(request,response, PayContants.SUCCESS); }else{ WxUtil.sendXmlMessage(request,response, PayContants.FAIL); throw new RuntimeException("签名不一致!"); } } }
WxUtil:
package com.ys.commons.utils.pay; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.InetAddress; import java.net.UnknownHostException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //微信工具类 public class WxUtil { //获取当前IP public static String getIp() { try { String spbill_create_ip = InetAddress.getLocalHost().getHostAddress(); return spbill_create_ip; } catch (UnknownHostException var2) { var2.printStackTrace(); return "获取IP失败..."; } } //输出xml格式 public static void sendXmlMessage(HttpServletRequest request, HttpServletResponse response, String content) { try { String contentXml = "<xml><return_code><![CDATA[" + content + "]]></return_code></xml>"; OutputStream os = response.getOutputStream(); BufferedWriter resBr = new BufferedWriter(new OutputStreamWriter(os)); resBr.write(contentXml); resBr.flush(); resBr.close(); } catch (IOException var6) { var6.printStackTrace(); } } //生成sign签名 public static String createSign(SortedMap<String, Object> packageParams, String KEY) { StringBuffer sb = new StringBuffer(); Set<Entry<String, Object>> es = packageParams.entrySet(); Iterator it = es.iterator(); while(it.hasNext()) { Entry<String, Object> entry = (Entry)it.next(); String k = (String)entry.getKey(); String v = (String)entry.getValue(); if(null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) { sb.append(k + "=" + v + "&"); } } sb.append("key=" + KEY); String sign = MD5Util.MD5Encode(sb.toString(), "UTF-8").toUpperCase(); return sign; } //将map转为xml public static String parseMapXML(SortedMap<String, Object> map) { String xmlResult = ""; StringBuffer sb = new StringBuffer(); sb.append("<xml>"); Iterator var3 = map.keySet().iterator(); while(var3.hasNext()) { String key = (String)var3.next(); String value = "<![CDATA[" + map.get(key) + "]]>"; sb.append("<" + key + ">" + value + "</" + key + ">"); System.out.println(); } sb.append("</xml>"); xmlResult = sb.toString(); return xmlResult; } //将xml转为map public static Map<String, Object> parseXmlMap(String xml) throws DocumentException { Document document = DocumentHelper.parseText(xml); Element root = document.getRootElement(); List<Element> elementList = root.elements(); Map<String, Object> map = new HashMap(); Iterator var5 = elementList.iterator(); while(var5.hasNext()) { Element e = (Element)var5.next(); map.put(e.getName(), e.getText()); } return map; } }
发送请求需要推荐一个非常好用的工具,里面各种常用的工具都封装好了hutool,如果想直接复制代码使用也需要引入此工具的maven库
注意:此工具只支持JDK 1.7以上至此代码已经完成,有意见建议的都可以留言,后续会更新最完整最新版的PayPal支付,同时有需要的也可以看看博主的支付宝PC支付
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。
查看更多16小时23分钟前回答Navicat for MySQL定时备份数据库及数据恢复详解
在做数据库修改或删除操作中,可能会导致数据错误,甚至数据库奔溃,而有效的定时备份能很好地保护数据库。本篇文章主要讲述Navicat for MySQL定时备份数据库和数据恢复等功能,同时可以定时播放电影等设置,希望对您有所帮助,如果文章中存在错误或不足之处,还请海涵~
一. 设置计划任务定时备份数据库
计划任务就是让电脑在指定的时间内执行指定的动作,这些动作可以是一个程序,也可以是一个批处理,但是至少是可以运行的!其实再通俗一点也就是相当于你在那个时间里面进行了对某个东西对鼠标双击的操作。
1.首先,创建数据库hcpmanage,表information,主要记录车票信息。
2.点击"任务"->"新建批处理作业",如下图所示。
3.然后弹出的对话框中,双击可用任务"Backup hcpmanage",并选择任务。点击保存按钮,设置为"20170418bf"。
4.然后该备份文件就会出现在计划列表中,如下图所示。
5.点击该"20170418bf",设置计划任务,如下图所示。
6.在弹出"计划"中设置每天23:58进行备份操作,如下图所示。
7.点击"应用",在弹出的"设置账户信息"中,输入开机密码,点击确定。
其中常用设置如下所示,包括完成任务计划、空闲时间和电源管理等。
8.当时间每天到达23:58时,数据库进行定时备份。其备份文件在"Windows/System32/Tasks"任务路径下,如下图所示。
另一个备份psc文件所在路径:Navicat\MySQL\servers\test\hcpmanage(连接-数据库)。
注意:在输入开机密码过程中,经常会报错"任务计划程序 再试着设置任务账户信息时出现错误",如下图所示,解决方法见第三部分。
二. 数据库恢复
假设现在该数据库已经毁坏,已删除表information,现在需要对齐进行恢复。
1.点击"备份" -> "还原备份",如下图所示。
2.它会默认弹出找到对应的数据库,选择该psc文件,如下图所示。
3.弹出"还原备份",时间为23:58进行的备份文件,点击"开始"按钮。
4.然后数据进行恢复成功,查看"信息日志",如下图所示。
5.数据还原成功,其他的方法类似。
三. 任务计划程序错误解决
在进行计划设置过程中,输入用户名或密码总会报错,尤其是密码为空的情况,如下所示。这个错误怎么解决呢?
1.在"服务"(cmd中命令services.msc)中"Task Scheduler"需要启动。
2.在"本地策略"(cmd中命令gpedit.msc)中"安全选项",需要禁用"账户:使用空密码的本地账户只允许进行控制台 登录"。注意是禁用,如下图所示。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。
查看更多
NaviCat连接时提示"不支持远程连接的MySql数据库"解决方法
后来参巧网上的文献后,通过Http方式成功连上服务器的MYSql数据库。特此记录一下: 首先到NaviCat官网(www.NaviCat.com.cn)上下载最新版本的NaviCat 安装完成后,打开NaviCat,如下图所示: 然后点击左上角的连接,弹出新键连接信息,如下图所示: 在主机名IP地址那里填写LocalHost 用户名与密码一栏则填写你所在的数据库用户名与密码。 这时候还不能连接数据库的,需要通过Http通道的形式进行数据库连接。 点击连接属性标签栏中的Http,如下图所示: 勾选使用Http通道后,在通道地址一栏输入你的网址与后台文件地址。 例如:http://www.google.cn/database.php 这里说明一下通道地址,前半部份:http://www.google.cn/是……