微信官方支付sdk的使用(微信公众号) 迷南。 2022-04-14 02:26 4270阅读 0赞 微信对多方调用微信支付已经给出了众多api文档,地址为:[https://pay.weixin.qq.com/wiki/doc/api/index.html][https_pay.weixin.qq.com_wiki_doc_api_index.html] 官方已经给出了SDK与DEMO,但是估计有些小伙伴还不清楚这个sdk该如何快速便捷的使用,今天就是讲这个的。 # 开发步骤: # ## (1)首先下载微信支付sdk,官方sdk于demo的类如下: ## ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x3Z18xNTQwNjUyMzU4_size_16_color_FFFFFF_t_70][] 这个sdk就已经把微信支付的功能封装在里面了,已经算是一个成形的代码级应用了.sdk已经把要做的工作都做了,剩下的就是你去调用了,就这么简单。首先我们看一下这些类的作用(就算不是很清楚内部,我们也可以开发,但作为一个有理想的程序员,还是要看一下): ### (1.1) IWXPayDomain.java ### 实现域名管理的,不需要我们做工作。这个抽象接口,测试包中已经帮助我们实现了,我们可以拿过来直接用。复制粘贴改个名字。 ![70][] ### (1.2) WXPayConstants.java ### 这是一个微信支付的常量类,里面有各种定义好的常量,在类里面定义了一个内部枚举,它的作用是限定了签名方式只能是MD5或者HMACSHA256。这里要注意的是,签名也是有SDK内部实现的,只有在使用到沙箱环境时,才用MD5签名。 ![70 1][] ### (1.3).WXPayConfig.java ### 这是一个抽象类,里边是一些微信支付的基本配置。是需要你自己继承并完善的。但是这个实现在SDK自带的测试包中已经实现了,直接把他复制过来。把自己的配置搞进去。 这一步主要的就是下载证书,在商户平台下载证书后,生产环境或者测试的电脑主机才可以调用微信支付下载证书后,放到指定位置,在配置一下路径,很简单,例如: ![70 2][] 这样配置的实现类就完成了。 ### (1.4).WXPay.java ### 最重要的类。就是这个类中已经封装好了所有方法 |方法名 | 说明 | |--------|--------| |microPay| 刷卡支付 | |unifiedOrder | 统一下单| |orderQuery | 查询订单 | |reverse | 撤销订单 | |closeOrder|关闭订单| |refund|申请退款| |refundQuery|查询退款| |downloadBill|下载对账单| |report|交易保障| |shortUrl|转换短链接| |authCodeToOpenid|授权码查询openid| ### (1.5)WXPayUtil.java ### 工具类,里边包含了要用到的方法,很全面。 微信支付接口传输数据是通过XML字符串来传输的,然后再两端再分别解析成映射结合。这是封装在内部的我们了解一下就可以了。还包括符号的生成,你看,签名都给你写好了。 当然,你也可以根据自己的需求在放一些其他的工具方法。 \* 注意: \* 证书文件不能放在web服务器虚拟目录,应放在有访问权限控制的目录中,防止被他人下载 \* 建议将证书文件名改为复杂且不容易猜测的文件名 \* 商户服务器要做好病毒和木马防护工作,不被非法侵入者窃取证书文件 \* 请妥善保管商户支付密钥、公众帐号SECRET,避免密钥泄露 \* 参数为\`Map<String, String>\`对象,返回类型也是\`Map<String, String>\` \* 方法内部会将参数会转换成含有\`appid\`、\`mch\_id\`、\`nonce\_str\`、\`sign\\\_type\`和\`sign\`的XML \* 可选HMAC-SHA256算法和MD5算法签名 \* 通过HTTPS请求得到返回数据后会对其做必要的处理(例如验证签名,签名错误则抛出异常) \* 对于downloadBill,无论是否成功都返回Map,且都含有\`return\_code\`和\`return\_msg\`,若成功,其中\`return\_code\`为\`SUCCESS\`,另外\`data\`对应对账单数据 ## (2)官方测试实例: ## \#\# 示例 配置类MyConfig: \`\`\`java import com.github.wxpay.sdk.WXPayConfig; import java.io.\*; public class MyConfig implements WXPayConfig\{ private byte\[\] certData; public MyConfig() throws Exception \{ String certPath = "/path/to/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 "wx8888888888888888"; \} public String getMchID() \{ return "12888888"; \} public String getKey() \{ return "88888888888888888888888888888888"; \} public InputStream getCertStream() \{ ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData); return certBis; \} public int getHttpConnectTimeoutMs() \{ return 8000; \} public int getHttpReadTimeoutMs() \{ return 10000; \} \} \`\`\` 统一下单: \`\`\`java import com.github.wxpay.sdk.WXPay; import java.util.HashMap; import java.util.Map; public class WXPayExample \{ public static void main(String\[\] args) throws Exception \{ MyConfig config = new MyConfig(); WXPay wxpay = new WXPay(config); Map<String, String> data = new HashMap<String, String>(); data.put("body", "腾讯充值中心-QQ会员充值"); data.put("out\_trade\_no", "2016090910595900000012"); data.put("device\_info", ""); data.put("fee\_type", "CNY"); data.put("total\_fee", "1"); data.put("spbill\_create\_ip", "123.12.12.123"); data.put("notify\_url", "http://www.example.com/wxpay/notify"); data.put("trade\_type", "NATIVE"); // 此处指定为扫码支付 data.put("product\_id", "12"); try \{ Map<String, String> resp = wxpay.unifiedOrder(data); System.out.println(resp); \} catch (Exception e) \{ e.printStackTrace(); \} \} \} \`\`\` 订单查询: \`\`\`java import com.github.wxpay.sdk.WXPay; import java.util.HashMap; import java.util.Map; public class WXPayExample \{ public static void main(String\[\] args) throws Exception \{ MyConfig config = new MyConfig(); WXPay wxpay = new WXPay(config); Map<String, String> data = new HashMap<String, String>(); data.put("out\_trade\_no", "2016090910595900000012"); try \{ Map<String, String> resp = wxpay.orderQuery(data); System.out.println(resp); \} catch (Exception e) \{ e.printStackTrace(); \} \} \} \`\`\` 退款查询: \`\`\`java import com.github.wxpay.sdk.WXPay; import java.util.HashMap; import java.util.Map; public class WXPayExample \{ public static void main(String\[\] args) throws Exception \{ MyConfig config = new MyConfig(); WXPay wxpay = new WXPay(config); Map<String, String> data = new HashMap<String, String>(); data.put("out\_trade\_no", "2016090910595900000012"); try \{ Map<String, String> resp = wxpay.refundQuery(data); System.out.println(resp); \} catch (Exception e) \{ e.printStackTrace(); \} \} \} \`\`\` 下载对账单: \`\`\`java import com.github.wxpay.sdk.WXPay; import java.util.HashMap; import java.util.Map; public class WXPayExample \{ public static void main(String\[\] args) throws Exception \{ MyConfig config = new MyConfig(); WXPay wxpay = new WXPay(config); Map<String, String> data = new HashMap<String, String>(); data.put("bill\_date", "20140603"); data.put("bill\_type", "ALL"); try \{ Map<String, String> resp = wxpay.downloadBill(data); System.out.println(resp); \} catch (Exception e) \{ e.printStackTrace(); \} \} \} \`\`\` 其他API的使用和上面类似。 暂时不支持下载压缩格式的对账单,但可以使用该SDK生成请求用的XML数据: \`\`\`java import com.github.wxpay.sdk.WXPay; import com.github.wxpay.sdk.WXPayUtil; import java.util.HashMap; import java.util.Map; public class WXPayExample \{ public static void main(String\[\] args) throws Exception \{ MyConfig config = new MyConfig(); WXPay wxpay = new WXPay(config); Map<String, String> data = new HashMap<String, String>(); data.put("bill\_date", "20140603"); data.put("bill\_type", "ALL"); data.put("tar\_type", "GZIP"); try \{ data = wxpay.fillRequestData(data); System.out.println(WXPayUtil.mapToXml(data)); \} catch (Exception e) \{ e.printStackTrace(); \} \} \} \`\`\` 收到支付结果通知时,需要验证签名,可以这样做: \`\`\`java import com.github.wxpay.sdk.WXPay; import com.github.wxpay.sdk.WXPayUtil; import java.util.Map; public class WXPayExample \{ public static void main(String\[\] args) throws Exception \{ String notifyData = "...."; // 支付结果通知的xml格式数据 MyConfig config = new MyConfig(); WXPay wxpay = new WXPay(config); Map<String, String> notifyMap = WXPayUtil.xmlToMap(notifyData); // 转换成map if (wxpay.isPayResultNotifySignatureValid(notifyMap)) \{ // 签名正确 // 进行处理。 // 注意特殊情况:订单已经退款,但收到了支付结果成功的通知,不应把商户侧订单状态从退款改成支付成功 \} else \{ // 签名错误,如果数据里没有sign字段,也认为是签名错误 \} \} \} \`\`\` HTTPS请求可选HMAC-SHA256算法和MD5算法签名: \`\`\` import com.github.wxpay.sdk.WXPay; import com.github.wxpay.sdk.WXPayConstants; public class WXPayExample \{ public static void main(String\[\] args) throws Exception \{ MyConfig config = new MyConfig(); WXPay wxpay = new WXPay(config, WXPayConstants.SignType.HMACSHA256); // ...... \} \} \`\`\` 若需要使用sandbox环境: \`\`\` import com.github.wxpay.sdk.WXPay; import com.github.wxpay.sdk.WXPayConstants; public class WXPayExample \{ public static void main(String\[\] args) throws Exception \{ MyConfig config = new MyConfig(); WXPay wxpay = new WXPay(config, WXPayConstants.SignType.MD5, true); // ...... \} \} ## ## [https_pay.weixin.qq.com_wiki_doc_api_index.html]: https://pay.weixin.qq.com/wiki/doc/api/index.html [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x3Z18xNTQwNjUyMzU4_size_16_color_FFFFFF_t_70]: /images/20220414/72a749750ea34aacb9d0fd3b4292ee52.png [70]: /images/20220414/0f94935f30f14a97b05adc312e95bcff.png [70 1]: /images/20220414/d7b9f713bcef447ea7a6515c8b0140ea.png [70 2]: /images/20220414/5b0888b5c17249da9b80386312cb832d.png
相关 微信跨公众号支付 先说下我的需求。我有两个公众号(不是订阅号,订阅号无法向公众号支付)分别为A和B,现在我关注公众号A,在公众号A中需要发起公众号B的支付,也就是说我在公众号A中向公众号B支付钱 - 日理万妓/ 2024年02月17日 17:35/ 0 赞/ 35 阅读
相关 微信公众号支付流程 本文介绍微信公众号的JSAPI支付方式: 用大白话倒着说: 1. 微信支付,最终要实现的是拉起微信支付jsapi提示用户输入密码支付这笔订单; 2. 拉起微信支付j 偏执的太偏执、/ 2023年10月05日 18:29/ 0 赞/ 55 阅读
相关 java对接微信支付:JSAPI支付(微信公众号支付) > 本文是【微信JSAPI支付】文章,主要讲解商户对接微信支付,简洁版测试 文章目录 一、JSAPI支付接入前准备 二、代码片段 1.引入Maven依赖 2.后端 港控/mmm°/ 2023年09月30日 22:53/ 0 赞/ 84 阅读
相关 微信公众号和微信支付接入流程(微信公众号程序开发) 公众号接入流程 + 登录,进入公众号,开发->基本配置拿到appid和AppSecret + 配置IP白名单 + 配置url token Enc 旧城等待,/ 2023年02月15日 05:21/ 0 赞/ 240 阅读
相关 微信公众号支付教程 [http://blog.csdn.net/Ani521smile/article/details/53308345][http_blog.csdn.net_Ani521smi 朴灿烈づ我的快乐病毒、/ 2022年06月07日 00:21/ 0 赞/ 412 阅读
相关 微信公众号支付开发 [http://www.cnblogs.com/yimiyan/p/5603657.html][http_www.cnblogs.com_yimiyan_p_5603657.h 忘是亡心i/ 2022年06月06日 22:56/ 0 赞/ 410 阅读
相关 微信公众号支付 最重要:公众号必须有支付权限 具体如何查看请百度 先配置一下 否则开发很蛋疼 楼主这几天都在蛋疼中 1.在公众号中获取 appid, mch 怼烎@/ 2022年05月29日 11:35/ 0 赞/ 402 阅读
相关 微信公众号支付 流程 1.支付参数准备(图就不上了) 公众号的APPID、商户号MchID、商户API支付秘钥(商户平台的账户中心下:需要用户自行下载证书及安装)。 2.平台配置 商户 柔情只为你懂/ 2022年05月22日 12:15/ 0 赞/ 500 阅读
相关 微信官方支付sdk的使用(微信公众号) 微信对多方调用微信支付已经给出了众多api文档,地址为:[https://pay.weixin.qq.com/wiki/doc/api/index.html][https_pa 迷南。/ 2022年04月14日 02:26/ 0 赞/ 4271 阅读
相关 vue微信公众号、H5微信支付 1.H5微信支付 后台会返回一个URL,前端直接跳转就OK(需要你传给后台一个ip,必须保证在同一域名下) 使用window.location.href =res.data 我会带着你远行/ 2021年11月26日 22:44/ 0 赞/ 702 阅读