# wechat-pay-sdk **Repository Path**: oschina_123_admin/wechat-pay-sdk ## Basic Information - **Project Name**: wechat-pay-sdk - **Description**: 让使用微信支付的朋友最快速度接入微信支付; 两行代码解决微信支付提供的各种服务, 开箱即用, 可扩展性超强(只需根据服务的上下行协议定义协议类后, 放入工厂即可获取调用结果). - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-05-06 - **Last Updated**: 2021-05-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 背景 让使用微信支付的朋友最快速度接入微信支付. ## 核心 两行代码解决微信支付提供的各种服务, 开箱即用, 可扩展性超强(只需根据服务的上下行协议定义协议类后, 放入工厂即可获取调用结果). ## 最近发布 ``` net.arccode wechat-pay-sdk 1.1.1 ``` ## 架构图 ![](http://www.arccode.net/images/wx-pay-sdk-2.jpg) ## 依赖 * JDK >= 1.7 目前发送`http`采用`okhttp`(更简洁, 更高效), 而`okhttp`依赖的JDK版本必须大于或等于`1.7`, 有需要兼容JDK 1.6的同学可以提`Issues`或`Pull requests`. ## 项目源代码 * 源码地址 [https://github.com/arccode/wechat-pay-sdk](https://github.com/arccode/wechat-pay-sdk) ## 目前支持的服务及调用示例 所有服务在单元测试类(WXPayClientTest.java)中均已测试通过, 下行参数`response.isSuccess == true`表示服务调用成功. ### 初始化 ``` private WXPayClient wxPayClient; private WXPayClient wxPayVIPClient; private String asyncNotifyUrl = "http://domain:port/path"; @Before public void before() { // 以下配置参数根据公司申请的微信支付帐号填写 String appId = ""; String mchId = ""; String key = ""; String certPwd = ""; // 绝对路径, 用于退款和商户支付 String certPath = ""; wxPayClient = new WXPayClient(appId, mchId, key); wxPayVIPClient = new WXPayClient(appId, mchId, key, certPwd, certPath); } ``` ### 扫码支付 官方文档详见: [https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1](https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1) ``` String nonceStr = SDKUtils.genRandomStringByLength(32); UnifiedOrderRequest request = new UnifiedOrderRequest("donate-899",SDKUtils.genOutTradeNo(),1, "192.168.1.1", asyncNotifyUrl, "NATIVE", nonceStr); UnifiedOrderResponse response = wxPayClient.execute(request); Assert.assertNotNull(response); LOG.info(JSON.toJSONString(response)); // TODO 开发人员根据 response中的属性值处理业务逻辑, 此处可完美嵌入业务层(小型系统)或服务层(大型系统) ``` ### 公众号支付 官方文档详见: [https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1](https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1) ``` String nonceStr = SDKUtils.genRandomStringByLength(32); UnifiedOrderRequest request = new UnifiedOrderRequest("donate-899",SDKUtils.genOutTradeNo(), 1, "192.168.1.1", asyncNotifyUrl, "JSAPI", nonceStr); request.setOpenId("oKVmeuHht8J0Ni58CSNe474AHA3E"); UnifiedOrderResponse response = wxPayClient.execute(request); Assert.assertNotNull(response); LOG.info(JSON.toJSONString(response)); // TODO 开发人员根据 response中的属性值处理业务逻辑, 此处可完美嵌入业务层(小型系统)或服务层(大型系统) ``` ### APP支付 官方文档详见: [https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1](https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1) ``` String nonceStr = SDKUtils.genRandomStringByLength(32); UnifiedOrderRequest request = new UnifiedOrderRequest("donate-899",SDKUtils.genOutTradeNo(), 1, "192.168.1.1", asyncNotifyUrl, "APP", nonceStr); UnifiedOrderResponse response = wxPayClient.execute(request); Assert.assertNotNull(response); LOG.info(JSON.toJSONString(response)); // TODO 开发人员根据 response中的属性值处理业务逻辑, 此处可完美嵌入业务层(小型系统)或服务层(大型系统) ``` ### 商家支付 官方文档详见: [https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2](https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2) ``` String nonceStr = SDKUtils.genRandomStringByLength(32); String customerOpenId = "oKVmeuHht8J0Ni58CSNe474AHA3E"; MchPayRequest mchPayRequest = new MchPayRequest(SDKUtils.genOutTradeNo(), customerOpenId, "NO_CHECK", 100, "xxxx年xx月结算", "192.168.1.1", nonceStr); MchPayResponse response = wxPayVIPClient.execute(mchPayRequest); Assert.assertNotNull(response); LOG.info(JSON.toJSONString(response)); // TODO 开发人员根据 response中的属性值处理业务逻辑, 此处可完美嵌入业务层(小型系统)或服务层(大型系统) ``` ### 退款 官方文档详见: [https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_4&index=6](https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_4&index=6) ``` String nonceStr = SDKUtils.genRandomStringByLength(32); RefundRequest request = new RefundRequest("T15121416014891124211768", SDKUtils.genOutRefundNo(), 1, 1, "112102020", nonceStr); RefundResponse response = wxPayVIPClient.execute(request); Assert.assertNotNull(response); LOG.info(JSON.toJSONString(response)); // TODO 开发人员根据 response中的属性值处理业务逻辑, 此处可完美嵌入业务层(小型系统)或服务层(大型系统) ``` ### 查询订单 官方文档详见: [https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_2&index=4](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_2&index=4) ``` /** * 查询订单详情 */ @Test public void queryOrder() throws WXPayApiException { String nonceStr = SDKUtils.genRandomStringByLength(32); QueryOrderRequest request = new QueryOrderRequest(null, "T18042215145391412971763", nonceStr); QueryOrderResponse response = wxPayClient.execute(request); Assert.assertNotNull(response); LOG.info(JSON.toJSONString(response)); // TODO 开发人员根据 response中的属性值处理业务逻辑, 此处可完美嵌入业务层(小型系统)或服务层(大型系统) } ``` ### 支付异步通知解析 官方文档详见: [https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_7](https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_7) ``` String notifyTxt = "\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " 1\n" + " \n" + " \n" + ""; PayNotifyResponse response = wxPayClient.parseNotify(notifyTxt, PayNotifyResponse.class); Assert.assertNotNull(response); LOG.info(JSON.toJSONString(response)); // TODO 开发人员根据 response中的属性值处理业务逻辑, 此处可完美嵌入业务层(小型系统)或服务层(大型系统) ``` ### 刷卡支付 官方文档详见: [https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1) 目前未使用, 待续...... ## 扩展 该SDK设计了一个服务工厂, 该工厂中包含HTTP执行器/返回数据解析方式(json/xml)/入参数据格式(json/xml)构造等, 开发人员需要增加服务仅需要根据服务协议文档编写上下行协议, 并在协议中指明API接口和返回数据类型, 再将上行协议放入工厂中执行即可; 可参考已完成的服务协议进行扩展编写. ## 版本发布历史 ### v1.0.0 初始化项目, 提供完整的开发模式和部分支付接口. * 扫码支付 * 公众号支付 * app支付 * 商家支付 * 退款 * 异步通知解析 ### v1.1.0 * 增加查询订单接口 * 微重构, 简化各接口上行参数 ### v1.1.1 * XXXRequest中恢复get/set方法 * 发布v1.1.1至Maven中央库 ## License [MIT](http://opensource.org/licenses/MIT) Copyright (c) 2017-present, arccode