+ * 获取自定义菜单配置接口 + * 本接口将会提供公众号当前使用的自定义菜单的配置,如果公众号是通过API调用设置的菜单,则返回菜单的开发配置,而如果公众号是在公众平台官网通过网站功能发布菜单,则本接口返回运营者设置的菜单配置。 + 请注意: + 1、第三方平台开发者可以通过本接口,在旗下公众号将业务授权给你后,立即通过本接口检测公众号的自定义菜单配置,并通过接口再次给公众号设置好自动回复规则,以提升公众号运营者的业务体验。 + 2、本接口与自定义菜单查询接口的不同之处在于,本接口无论公众号的接口是如何设置的,都能查询到接口,而自定义菜单查询接口则仅能查询到使用API设置的菜单配置。 + 3、认证/未认证的服务号/订阅号,以及接口测试号,均拥有该接口权限。 + 4、从第三方平台的公众号登录授权机制上来说,该接口从属于消息与菜单权限集。 + 5、本接口中返回的图片/语音/视频为临时素材(临时素材每次获取都不同,3天内有效,通过素材管理-获取临时素材接口来获取这些素材),本接口返回的图文消息为永久素材素材(通过素材管理-获取永久素材接口来获取这些素材)。 + * 接口调用请求说明: + http请求方式: GET(请使用https协议) + https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token=ACCESS_TOKEN + *+ */ + WxMpGetSelfMenuInfoResult getSelfMenuInfo() throws WxErrorException; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java index 2fcd4cb92..e1396afbb 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java @@ -2,7 +2,6 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.bean.pay.WxPayJsSDKCallback; -import me.chanjar.weixin.mp.bean.pay.result.WxPayOrderCloseResult; import me.chanjar.weixin.mp.bean.pay.request.WxEntPayRequest; import me.chanjar.weixin.mp.bean.pay.request.WxPayRefundRequest; import me.chanjar.weixin.mp.bean.pay.request.WxPaySendRedpackRequest; @@ -13,8 +12,9 @@ import java.io.File; import java.util.Map; /** - * 微信支付相关接口 - * Created by Binary Wang on 2016/7/28. + * 微信支付相关接口 + * Created by Binary Wang on 2016/7/28. + * * @author binarywang (https://github.com/binarywang) */ public interface WxMpPayService { @@ -24,14 +24,15 @@ public interface WxMpPayService { * 查询订单(详见https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2) * 该接口提供所有微信支付订单的查询,商户可以通过查询订单接口主动查询订单状态,完成下一步的业务逻辑。 * 需要调用查询接口的情况: - ◆ 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知; - ◆ 调用支付接口后,返回系统错误或未知交易状态情况; - ◆ 调用被扫支付API,返回USERPAYING的状态; - ◆ 调用关单或撤销接口API之前,需确认支付状态; + * ◆ 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知; + * ◆ 调用支付接口后,返回系统错误或未知交易状态情况; + * ◆ 调用被扫支付API,返回USERPAYING的状态; + * ◆ 调用关单或撤销接口API之前,需确认支付状态; * 接口地址:https://api.mch.weixin.qq.com/pay/orderquery * + * * @param transactionId 微信支付分配的商户号 - * @param outTradeNo 商户系统内部的订单号,当没提供transaction_id时需要传这个。 + * @param outTradeNo 商户系统内部的订单号,当没提供transaction_id时需要传这个。 * @throws WxErrorException */ WxPayOrderQueryResult queryOrder(String transactionId, String outTradeNo) throws WxErrorException; @@ -47,6 +48,7 @@ public interface WxMpPayService { * 接口地址:https://api.mch.weixin.qq.com/pay/closeorder * 是否需要证书: 不需要。 * + * * @param outTradeNo 商户系统内部的订单号,当没提供transaction_id时需要传这个。 * @throws WxErrorException */ @@ -56,16 +58,18 @@ public interface WxMpPayService { * 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1) * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识" * 接口地址:https://api.mch.weixin.qq.com/pay/unifiedorder - * @throws WxErrorException - * @param request 请求对象 * + * @param request 请求对象,注意一些参数如appid、mchid等不用设置,方法内会自动从配置对象中获取到(前提是对应配置中已经设置) + * @throws WxErrorException */ WxPayUnifiedOrderResult unifiedOrder(WxPayUnifiedOrderRequest request) throws WxErrorException; /** * 该接口调用“统一下单”接口,并拼装发起支付请求需要的参数 * 详见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN - * @param request 请求对象 + * + * @param request 请求对象,注意一些参数如appid、mchid等不用设置,方法内会自动从配置对象中获取到(前提是对应配置中已经设置) + * @throws WxErrorException */ Map
+ * 微信支付-查询退款 + * 应用场景: + * 提交退款申请后,通过调用该接口查询退款状态。退款有一定延时,用零钱支付的退款20分钟内到账,银行卡支付的退款3个工作日后重新查询退款状态。 + * 详见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_5 + * 接口链接:https://api.mch.weixin.qq.com/pay/refundquery + *+ * 以下四个参数四选一 + * @param transactionId 微信订单号 + * @param outTradeNo 商户订单号 + * @param outRefundNo 商户退款单号 + * @param refundId 微信退款单号 + * @return 退款信息 + */ + WxPayRefundQueryResult refundQuery(String transactionId, String outTradeNo, String outRefundNo, String refundId) throws WxErrorException; + /** * 读取支付结果通知 * 详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7 - * */ WxPayJsSDKCallback getJSSDKCallbackData(String xmlData) throws WxErrorException; @@ -93,7 +114,6 @@ public interface WxMpPayService { * 计算Map键值对是否和签名相符, * 按照字段名的 ASCII 码从小到大排序(字典序)后,使用 URL 键值对的 格式(即 key1=value1&key2=value2...)拼接成字符串 * - * */ boolean checkJSSDKCallbackDataSignature(Map
* 文档详见: * 发送普通红包 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3 + * 接口地址:https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack * 发送裂变红包 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5&index=4 + * 接口地址:https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack *+ * * @param request 请求对象 - * @param keyFile 证书文件对象 + * @param keyFile 证书文件对象 */ WxPaySendRedpackResult sendRedpack(WxPaySendRedpackRequest request, File keyFile) throws WxErrorException; + /** + *
+ * 查询红包记录 + * 用于商户对已发放的红包进行查询红包的具体信息,可支持普通红包和裂变包。 + * 请求Url https://api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo + * 是否需要证书 是(证书及使用说明详见商户证书) + * 请求方式 POST + *+ * @param mchBillNo 商户发放红包的商户订单号,比如10000098201411111234567890 + * @param keyFile 证书文件对象 + */ + WxPayRedpackQueryResult queryRedpack(String mchBillNo, File keyFile) throws WxErrorException; + /** *
* 企业付款业务是基于微信支付商户平台的资金管理能力,为了协助商户方便地实现企业向个人付款,针对部分有开发能力的商户,提供通过API完成企业付款的功能。 @@ -118,8 +154,9 @@ public interface WxMpPayService { * 文档详见:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2 * 接口链接:https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers *+ * * @param request 请求对象 - * @param keyFile 证书文件对象 + * @param keyFile 证书文件对象 */ WxEntPayResult entPay(WxEntPayRequest request, File keyFile) throws WxErrorException; @@ -130,8 +167,9 @@ public interface WxMpPayService { * 文档详见:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_3 * 接口链接:https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo * + * * @param partnerTradeNo 商户订单号 - * @param keyFile 证书文件对象 + * @param keyFile 证书文件对象 */ WxEntPayQueryResult queryEntPay(String partnerTradeNo, File keyFile) throws WxErrorException; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java index a74e718db..4fa91badf 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java @@ -14,8 +14,8 @@ public interface WxMpService { /** *
- * 验证推送过来的消息的正确性 - * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=验证消息真实性 + * 验证消息的确来自微信服务器 + * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319&token=&lang=zh_CN **/ boolean checkSignature(String timestamp, String nonce, String signature); @@ -36,7 +36,7 @@ public interface WxMpService { * * 程序员在非必要情况下尽量不要主动调用此方法 * - * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=获取access_token + * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183&token=&lang=zh_CN * * * @param forceRefresh 强制刷新 @@ -55,7 +55,7 @@ public interface WxMpService { * 获得jsapi_ticket * 获得时会检查jsapiToken是否过期,如果过期了,那么就刷新一下,否则就什么都不干 * - * 详情请见:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD.951-JS-SDK.E4.BD.BF.E7.94.A8.E6.9D.83.E9.99.90.E7.AD.BE.E5.90.8D.E7.AE.97.E6.B3.95 + * 详情请见:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN * * * @param forceRefresh 强制刷新 @@ -66,7 +66,7 @@ public interface WxMpService { *
* 创建调用jsapi时所需要的签名 * - * 详情请见:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD.951-JS-SDK.E4.BD.BF.E7.94.A8.E6.9D.83.E9.99.90.E7.AD.BE.E5.90.8D.E7.AE.97.E6.B3.95 + * 详情请见:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN **/ WxJsapiSignature createJsapiSignature(String url) throws WxErrorException; @@ -75,7 +75,7 @@ public interface WxMpService { *
* 上传群发用的图文消息,上传后才能群发图文消息 * - * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=高级群发接口 + * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN ** * @see #massGroupMessageSend(me.chanjar.weixin.mp.bean.WxMpMassTagMessage) @@ -86,7 +86,7 @@ public interface WxMpService { /** *
* 上传群发用的视频,上传后才能群发视频消息 - * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=高级群发接口 + * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN ** * @see #massGroupMessageSend(me.chanjar.weixin.mp.bean.WxMpMassTagMessage) @@ -99,7 +99,7 @@ public interface WxMpService { * 分组群发消息 * 如果发送图文消息,必须先使用 {@link #massNewsUpload(me.chanjar.weixin.mp.bean.WxMpMassNews)} 获得media_id,然后再发送 * 如果发送视频消息,必须先使用 {@link #massVideoUpload(me.chanjar.weixin.mp.bean.WxMpMassVideo)} 获得media_id,然后再发送 - * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=高级群发接口 + * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN * */ WxMpMassSendResult massGroupMessageSend(WxMpMassTagMessage message) throws WxErrorException; @@ -109,7 +109,7 @@ public interface WxMpService { * 按openId列表群发消息 * 如果发送图文消息,必须先使用 {@link #massNewsUpload(me.chanjar.weixin.mp.bean.WxMpMassNews)} 获得media_id,然后再发送 * 如果发送视频消息,必须先使用 {@link #massVideoUpload(me.chanjar.weixin.mp.bean.WxMpMassVideo)} 获得media_id,然后再发送 - * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=高级群发接口 + * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN * */ WxMpMassSendResult massOpenIdsMessageSend(WxMpMassOpenIdsMessage message) throws WxErrorException; @@ -263,84 +263,84 @@ public interface WxMpService { WxMpConfigStorage getWxMpConfigStorage(); /** - * 返回客服接口方法实现类,以方便调用个其各种接口 + * 返回客服接口方法实现类,以方便调用其各个接口 * * @return WxMpKefuService */ WxMpKefuService getKefuService(); /** - * 返回素材相关接口方法的实现类对象,以方便调用个其各种接口 + * 返回素材相关接口方法的实现类对象,以方便调用其各个接口 * * @return WxMpMaterialService */ WxMpMaterialService getMaterialService(); /** - * 返回菜单相关接口方法的实现类对象,以方便调用个其各种接口 + * 返回菜单相关接口方法的实现类对象,以方便调用其各个接口 * * @return WxMpMenuService */ WxMpMenuService getMenuService(); /** - * 返回用户相关接口方法的实现类对象,以方便调用个其各种接口 + * 返回用户相关接口方法的实现类对象,以方便调用其各个接口 * * @return WxMpUserService */ WxMpUserService getUserService(); /** - * 返回用户标签相关接口方法的实现类对象,以方便调用个其各种接口 + * 返回用户标签相关接口方法的实现类对象,以方便调用其各个接口 * * @return WxMpUserTagService */ WxMpUserTagService getUserTagService(); /** - * 返回二维码相关接口方法的实现类对象,以方便调用个其各种接口 + * 返回二维码相关接口方法的实现类对象,以方便调用其各个接口 * * @return WxMpQrcodeService */ WxMpQrcodeService getQrcodeService(); /** - * 返回卡券相关接口方法的实现类对象,以方便调用个其各种接口 + * 返回卡券相关接口方法的实现类对象,以方便调用其各个接口 * * @return WxMpCardService */ WxMpCardService getCardService(); /** - * 返回微信支付相关接口方法的实现类对象,以方便调用个其各种接口 + * 返回微信支付相关接口方法的实现类对象,以方便调用其各个接口 * * @return WxMpPayService */ WxMpPayService getPayService(); /** - * 返回数据分析统计相关接口方法的实现类对象,以方便调用个其各种接口 + * 返回数据分析统计相关接口方法的实现类对象,以方便调用其各个接口 * * @return WxMpDataCubeService */ WxMpDataCubeService getDataCubeService(); /** - * 返回用户黑名单管理相关接口方法的实现类对象,以方便调用其各种接口 + * 返回用户黑名单管理相关接口方法的实现类对象,以方便调用其各个接口 * * @return WxMpUserBlacklistService */ WxMpUserBlacklistService getBlackListService(); /** - * 返回门店管理相关接口方法的实现类对象,以方便调用其各种接口 + * 返回门店管理相关接口方法的实现类对象,以方便调用其各个接口 * * @return WxMpStoreService */ WxMpStoreService getStoreService(); /** - * 返回模板消息相关接口方法的实现类对象,以方便调用其各种接口 + * 返回模板消息相关接口方法的实现类对象,以方便调用其各个接口 * * @return WxMpTemplateMsgService */ diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java index 2f40f709e..1373c83d1 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java @@ -1,12 +1,13 @@ package me.chanjar.weixin.mp.api.impl; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import me.chanjar.weixin.common.bean.menu.WxMenu; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.WxMpMenuService; import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.menu.WxMpGetSelfMenuInfoResult; +import me.chanjar.weixin.mp.bean.menu.WxMpSelfMenuInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Created by Binary Wang on 2016/7/21. @@ -14,7 +15,7 @@ import me.chanjar.weixin.mp.api.WxMpService; public class WxMpMenuServiceImpl implements WxMpMenuService { private static final String API_URL_PREFIX = "https://api.weixin.qq.com/cgi-bin/menu"; private static Logger log = LoggerFactory - .getLogger(WxMpMenuServiceImpl.class); + .getLogger(WxMpMenuServiceImpl.class); private WxMpService wxMpService; @@ -74,10 +75,17 @@ public class WxMpMenuServiceImpl implements WxMpMenuService { } catch (WxErrorException e) { // 46003 不存在的菜单数据 46002 不存在的菜单版本 if (e.getError().getErrorCode() == 46003 - || e.getError().getErrorCode() == 46002) { + || e.getError().getErrorCode() == 46002) { return null; } throw e; } } + + @Override + public WxMpGetSelfMenuInfoResult getSelfMenuInfo() throws WxErrorException { + String url = "https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info"; + String resultContent = this.wxMpService.get(url, null); + return WxMpGetSelfMenuInfoResult.fromJson(resultContent); + } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java index 3273cd2b8..78e76e0f7 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java @@ -8,7 +8,6 @@ import me.chanjar.weixin.common.util.xml.XStreamInitializer; import me.chanjar.weixin.mp.api.WxMpPayService; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.pay.WxPayJsSDKCallback; -import me.chanjar.weixin.mp.bean.pay.result.WxPayOrderCloseResult; import me.chanjar.weixin.mp.bean.pay.request.*; import me.chanjar.weixin.mp.bean.pay.result.*; import org.apache.commons.codec.digest.DigestUtils; @@ -42,13 +41,11 @@ import java.util.*; */ public class WxMpPayServiceImpl implements WxMpPayService { - protected final Logger log = LoggerFactory.getLogger(this.getClass()); - private static final String PAY_BASE_URL = "https://api.mch.weixin.qq.com"; - private static final String[] TRADE_TYPES = new String[]{"JSAPI","NATIVE", "APP"}; - private static final String[] REFUND_ACCOUNT = new String[]{"REFUND_SOURCE_RECHARGE_FUNDS", + private static final String[] TRADE_TYPES = new String[]{"JSAPI", "NATIVE", "APP"}; + private static final String[] REFUND_ACCOUNT = new String[]{"REFUND_SOURCE_RECHARGE_FUNDS", "REFUND_SOURCE_UNSETTLED_FUNDS"}; - + protected final Logger log = LoggerFactory.getLogger(this.getClass()); private WxMpService wxMpService; public WxMpPayServiceImpl(WxMpService wxMpService) { @@ -57,7 +54,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { @Override public WxPayRefundResult refund(WxPayRefundRequest request, File keyFile) - throws WxErrorException { + throws WxErrorException { checkParameters(request); XStream xstream = XStreamInitializer.getInstance(); @@ -67,7 +64,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { request.setAppid(this.wxMpService.getWxMpConfigStorage().getAppId()); String partnerId = this.wxMpService.getWxMpConfigStorage().getPartnerId(); request.setMchId(partnerId); - request.setNonceStr( System.currentTimeMillis() + ""); + request.setNonceStr(System.currentTimeMillis() + ""); request.setOpUserId(partnerId); String sign = this.createSign(BeanUtils.xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey()); request.setSign(sign); @@ -79,11 +76,45 @@ public class WxMpPayServiceImpl implements WxMpPayService { return result; } + @Override + public WxPayRefundQueryResult refundQuery(String transactionId, String outTradeNo, String outRefundNo, String refundId) throws WxErrorException { + if ((StringUtils.isBlank(transactionId) && StringUtils.isBlank(outTradeNo) && StringUtils.isBlank(outRefundNo) && StringUtils.isBlank(refundId)) || + (StringUtils.isNotBlank(transactionId) && StringUtils.isNotBlank(outTradeNo) && StringUtils.isNotBlank(outRefundNo) && StringUtils.isNotBlank(refundId))) { + throw new IllegalArgumentException("transaction_id , out_trade_no,out_refund_no, refund_id 必须四选一"); + } + + XStream xstream = XStreamInitializer.getInstance(); + xstream.processAnnotations(WxPayRefundQueryRequest.class); + xstream.processAnnotations(WxPayRefundQueryResult.class); + + WxPayRefundQueryRequest request = new WxPayRefundQueryRequest(); + request.setOutTradeNo(StringUtils.trimToNull(outTradeNo)); + request.setTransactionId(StringUtils.trimToNull(transactionId)); + request.setOutRefundNo(StringUtils.trimToNull(outRefundNo)); + request.setRefundId(StringUtils.trimToNull(refundId)); + + request.setAppid(this.wxMpService.getWxMpConfigStorage().getAppId()); + request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId()); + request.setNonceStr(System.currentTimeMillis() + ""); + + String sign = this.createSign(BeanUtils.xmlBean2Map(request), + this.wxMpService.getWxMpConfigStorage().getPartnerKey()); + request.setSign(sign); + + String url = PAY_BASE_URL + "/pay/refundquery"; + + String responseContent = this.executeRequest(url, xstream.toXML(request)); + WxPayRefundQueryResult result = (WxPayRefundQueryResult) xstream.fromXML(responseContent); + result.composeRefundRecords(responseContent); + this.checkResult(result); + return result; + } + private void checkResult(WxPayBaseResult result) throws WxErrorException { if (!"SUCCESS".equalsIgnoreCase(result.getReturnCode()) || !"SUCCESS".equalsIgnoreCase(result.getResultCode())) { throw new WxErrorException(WxError.newBuilder().setErrorCode(-1) - .setErrorMsg("返回代码:" + result.getReturnCode() + ", 返回信息: " + .setErrorMsg("返回代码: " + result.getReturnCode() + ", 返回信息: " + result.getReturnMsg() + ", 结果代码: " + result.getResultCode() + ", 错误代码: " + result.getErrCode() + ", 错误详情: " + result.getErrCodeDes()) .build()); @@ -94,7 +125,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { BeanUtils.checkRequiredFields(request); if (StringUtils.isNotBlank(request.getRefundAccount())) { - if(!ArrayUtils.contains(REFUND_ACCOUNT, request.getRefundAccount())){ + if (!ArrayUtils.contains(REFUND_ACCOUNT, request.getRefundAccount())) { throw new IllegalArgumentException("refund_account目前必须为" + Arrays.toString(REFUND_ACCOUNT) + "其中之一"); } } @@ -118,14 +149,14 @@ public class WxMpPayServiceImpl implements WxMpPayService { @Override public boolean checkJSSDKCallbackDataSignature(Map
+ * Created by Binary Wang on 2016-11-25. + * @author binarywang(Binary Wang) + *+ */ +public class WxMpGetSelfMenuInfoResult { + @SerializedName("selfmenu_info") + private WxMpSelfMenuInfo selfMenuInfo; + + @SerializedName("is_menu_open") + private Integer isMenuOpen; + + public static WxMpGetSelfMenuInfoResult fromJson(String json) { + return WxGsonBuilder.create().fromJson(json, WxMpGetSelfMenuInfoResult.class); + } + + @Override + public String toString() { + return ToStringUtils.toSimpleString(this); + } + + public WxMpSelfMenuInfo getSelfMenuInfo() { + return selfMenuInfo; + } + + public void setSelfMenuInfo(WxMpSelfMenuInfo selfMenuInfo) { + this.selfMenuInfo = selfMenuInfo; + } + + public Integer getIsMenuOpen() { + return isMenuOpen; + } + + public void setIsMenuOpen(Integer isMenuOpen) { + this.isMenuOpen = isMenuOpen; + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/menu/WxMpSelfMenuInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/menu/WxMpSelfMenuInfo.java new file mode 100644 index 000000000..f2c0c4ca5 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/menu/WxMpSelfMenuInfo.java @@ -0,0 +1,288 @@ +package me.chanjar.weixin.mp.bean.menu; + +import com.google.gson.annotations.SerializedName; +import me.chanjar.weixin.common.util.ToStringUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + *
+ * Created by Binary Wang on 2016-11-25. + * @author binarywang(Binary Wang) + *+ */ +public class WxMpSelfMenuInfo { + /** + * 菜单按钮 + */ + @SerializedName("button") + private List
+ * 菜单的类型,公众平台官网上能够设置的菜单类型有view(跳转网页)、text(返回文本,下同)、img、photo、video、voice。 + * 使用API设置的则有8种,详见《自定义菜单创建接口》 + *+ */ + @SerializedName("type") + private String type; + + /** + * 菜单名称 + */ + @SerializedName("name") + private String name; + + /** + *
+ * 对于不同的菜单类型,value的值意义不同。 + * 官网上设置的自定义菜单: + *
+ * 注释中各行对应含义: + * 字段名 + * 字段 + * 必填 + * 示例值 + * 类型 + * 说明 + * Created by Binary Wang on 2016-11-28. + * @author binarywang(Binary Wang) + *+ */ +@XStreamAlias("xml") +public class WxPayRedpackQueryRequest extends WxPayBaseRequest { + /** + * 商户订单号 + * mch_billno + * 是 + * 10000098201411111234567890 + * String(28) + * 商户发放红包的商户订单号 + */ + @XStreamAlias("mch_billno") + private String mchBillNo; + + /** + * 订单类型 + * bill_type + * 是 + * MCHT + * String(32) + * MCHT:通过商户订单号获取红包信息。 + */ + @XStreamAlias("bill_type") + private String billType; + + public String getBillType() { + return billType; + } + + public void setBillType(String billType) { + this.billType = billType; + } + + public String getMchBillNo() { + return mchBillNo; + } + + public void setMchBillNo(String mchBillNo) { + this.mchBillNo = mchBillNo; + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayRefundQueryRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayRefundQueryRequest.java new file mode 100644 index 000000000..373b0917d --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayRefundQueryRequest.java @@ -0,0 +1,135 @@ +package me.chanjar.weixin.mp.bean.pay.request; + +import com.thoughtworks.xstream.annotations.XStreamAlias; + +/** + *
+ * Created by Binary Wang on 2016-11-24. + * @author binarywang(Binary Wang) + *+ */ +@XStreamAlias("xml") +public class WxPayRefundQueryRequest extends WxPayBaseRequest { + /** + *
+ * 设备号 + * device_info + * 否 + * String(32) + * 013467007045764 + * 商户自定义的终端设备号,如门店编号、设备的ID等 + *+ */ + @XStreamAlias("device_info") + private String deviceInfo; + + /** + *
+ * 签名类型 + * sign_type + * 否 + * String(32) + * HMAC-SHA256 + * 签名类型,目前支持HMAC-SHA256和MD5,默认为MD5 + *+ */ + @XStreamAlias("sign_type") + private String signType; + + //************以下四选一************ + /** + *
+ * 微信订单号 + * transaction_id + * String(32) + * 1217752501201407033233368018 + * 微信订单号 + *+ */ + @XStreamAlias("transaction_id") + private String transactionId; + + /** + *
+ * 商户订单号 + * out_trade_no + * String(32) + * 1217752501201407033233368018 + * 商户系统内部的订单号 + *+ */ + @XStreamAlias("out_trade_no") + private String outTradeNo; + + /** + *
+ * 商户退款单号 + * out_refund_no + * String(32) + * 1217752501201407033233368018 + * 商户侧传给微信的退款单号 + *+ */ + @XStreamAlias("out_refund_no") + private String outRefundNo; + + /** + *
+ * 微信退款单号 + * refund_id + * String(28) + * 1217752501201407033233368018 + * 微信生成的退款单号,在申请退款接口有返回 + *+ */ + @XStreamAlias("refund_id") + private String refundId; + + public String getDeviceInfo() { + return deviceInfo; + } + + public void setDeviceInfo(String deviceInfo) { + this.deviceInfo = deviceInfo; + } + + public String getSignType() { + return signType; + } + + public void setSignType(String signType) { + this.signType = signType; + } + + public String getTransactionId() { + return transactionId; + } + + public void setTransactionId(String transactionId) { + this.transactionId = transactionId; + } + + public String getOutTradeNo() { + return outTradeNo; + } + + public void setOutTradeNo(String outTradeNo) { + this.outTradeNo = outTradeNo; + } + + public String getOutRefundNo() { + return outRefundNo; + } + + public void setOutRefundNo(String outRefundNo) { + this.outRefundNo = outRefundNo; + } + + public String getRefundId() { + return refundId; + } + + public void setRefundId(String refundId) { + this.refundId = refundId; + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPaySendRedpackRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPaySendRedpackRequest.java index cad2cc521..535b2941c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPaySendRedpackRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPaySendRedpackRequest.java @@ -14,7 +14,7 @@ public class WxPaySendRedpackRequest { * 商户订单号(每个订单号必须唯一) 组成:mch_id+yyyymmdd+10位一天内不能重复的数字。 接口根据商户订单号支持重入,如出现超时可再调用。 */ @XStreamAlias("mch_billno") - private String mchBillno; + private String mchBillNo; /** * send_name @@ -157,12 +157,12 @@ public class WxPaySendRedpackRequest { @XStreamAlias("consume_mch_id") private String consumeMchId; - public String getMchBillno() { - return this.mchBillno; + public String getMchBillNo() { + return mchBillNo; } - public void setMchBillno(String mchBillno) { - this.mchBillno = mchBillno; + public void setMchBillNo(String mchBillNo) { + this.mchBillNo = mchBillNo; } public String getSendName() { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderQueryResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderQueryResult.java index 17b3a412b..373497f37 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderQueryResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderQueryResult.java @@ -1,10 +1,10 @@ package me.chanjar.weixin.mp.bean.pay.result; -import java.util.List; - import com.google.common.collect.Lists; import com.thoughtworks.xstream.annotations.XStreamAlias; +import java.util.List; + /** *
* 查询订单 返回结果对象 diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRedpackQueryResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRedpackQueryResult.java new file mode 100644 index 000000000..faf2df674 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRedpackQueryResult.java @@ -0,0 +1,405 @@ +package me.chanjar.weixin.mp.bean.pay.result; + +import com.thoughtworks.xstream.annotations.XStreamAlias; + +/** + *+ * 注释中各行对应含义: + * 字段名 + * 字段 + * 必填 + * 示例值 + * 类型 + * 说明 + * Created by Binary Wang on 2016-11-28. + * @author binarywang(Binary Wang) + *+ */ +public class WxPayRedpackQueryResult extends WxPayBaseResult { + + /** + *+ * 商户订单号 + * mch_billno + * 是 + * 10000098201411111234567890 + * String(28) + * 商户使用查询API填写的商户单号的原路返回 + *+ */ + @XStreamAlias("mch_billno") + private String mchBillNo; + + /** + *+ * 红包单号 + * detail_id + * 是 + * 1000000000201503283103439304 + * String(32) + * 使用API发放现金红包时返回的红包单号 + *+ */ + @XStreamAlias("detail_id") + private String detailId; + + /** + *+ * 红包状态 + * status + * 是 + * RECEIVED + * string(16) + * SENDING:发放中, + * SENT:已发放待领取, + * FAILED:发放失败, + * RECEIVED:已领取, + * RFUND_ING:退款中, + * REFUND:已退款 + *+ */ + @XStreamAlias("status") + private String status; + + /** + *+ * 发放类型 + * send_type + * 是 + * API + * String(32) + * API:通过API接口发放, + * UPLOAD:通过上传文件方式发放, + * ACTIVITY:通过活动方式发放 + *+ */ + @XStreamAlias("send_type") + private String sendType; + + /** + *+ * 红包类型 + * hb_type + * 是 + * GROUP + * String(32) + * GROUP:裂变红包, + * NORMAL:普通红包 + *+ */ + @XStreamAlias("hb_type") + private String hbType; + + /** + *+ * 红包个数 + * total_num + * 是 + * 1 + * int + * 红包个数 + *+ */ + @XStreamAlias("total_num") + private Integer totalNum; + + /** + *+ * 红包金额 + * total_amount + * 是 + * 5000 + * int + * 红包总金额(单位分) + *+ */ + @XStreamAlias("total_amount") + private Integer totalAmount; + + /** + *+ * 失败原因 + * reason + * 否 + * 余额不足 + * String(32) + * 发送失败原因 + *+ */ + @XStreamAlias("reason") + private String reason; + + /** + *+ * 红包发送时间 + * send_time + * 是 + * 2015-04-21 20:00:00 + * String(32) + * 红包的发送时间 + *+ */ + @XStreamAlias("send_time") + private String sendTime; + + /** + *+ * 红包退款时间 + * refund_time + * 否 + * 2015-04-21 23:03:00 + * String(32) + * 红包的退款时间(如果其未领取的退款) + *+ */ + @XStreamAlias("refund_time") + private String refundTime; + + /** + *+ * 红包退款金额 + * refund_amount + * 否 + * 8000 + * Int + * 红包退款金额 + *+ */ + @XStreamAlias("refund_amount") + private Integer refundAmount; + + /** + *+ * 祝福语 + * wishing + * 否 + * 新年快乐 + * String(128) + * 祝福语 + *+ */ + @XStreamAlias("wishing") + private String wishing; + + /** + *+ * 活动描述 + * remark + * 否 + * 新年红包 + * String(256) + * 活动描述,低版本微信可见 + *+ */ + @XStreamAlias("remark") + private String remark; + + /** + *+ * 活动名称 + * act_name + * 否 + * 新年红包 + * String(32) + * 发红包的活动名称 + *+ */ + @XStreamAlias("act_name") + private String actName; + + /** + *+ * 裂变红包领取列表 + * hblist + * 否 + * + * + * 裂变红包的领取列表 + *+ */ + @XStreamAlias("hblist") + private String hblist; + + /** + *+ * 领取红包的Openid + * openid + * 是 + * ohO4GtzOAAYMp2yapORH3dQB3W18 + * String(32) + * 领取红包的openid + *+ */ + @XStreamAlias("openid") + private String openid; + + /** + *+ * 金额 + * amount + * 是 + * 100 + * int + * 领取金额 + *+ */ + @XStreamAlias("amount") + private Integer amount; + + /** + *+ * 接收时间 + * rcv_time + * 是 + * 2015-04-21 20:00:00 + * String(32) + * 领取红包的时间 + *+ */ + @XStreamAlias("rcv_time") + private String receiveTime; + + public String getMchBillNo() { + return mchBillNo; + } + + public void setMchBillNo(String mchBillNo) { + this.mchBillNo = mchBillNo; + } + + public String getDetailId() { + return detailId; + } + + public void setDetailId(String detailId) { + this.detailId = detailId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSendType() { + return sendType; + } + + public void setSendType(String sendType) { + this.sendType = sendType; + } + + public String getHbType() { + return hbType; + } + + public void setHbType(String hbType) { + this.hbType = hbType; + } + + public Integer getTotalNum() { + return totalNum; + } + + public void setTotalNum(Integer totalNum) { + this.totalNum = totalNum; + } + + public Integer getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Integer totalAmount) { + this.totalAmount = totalAmount; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public String getSendTime() { + return sendTime; + } + + public void setSendTime(String sendTime) { + this.sendTime = sendTime; + } + + public String getRefundTime() { + return refundTime; + } + + public void setRefundTime(String refundTime) { + this.refundTime = refundTime; + } + + public Integer getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Integer refundAmount) { + this.refundAmount = refundAmount; + } + + public String getWishing() { + return wishing; + } + + public void setWishing(String wishing) { + this.wishing = wishing; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getActName() { + return actName; + } + + public void setActName(String actName) { + this.actName = actName; + } + + public String getHblist() { + return hblist; + } + + public void setHblist(String hblist) { + this.hblist = hblist; + } + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public Integer getAmount() { + return amount; + } + + public void setAmount(Integer amount) { + this.amount = amount; + } + + public String getReceiveTime() { + return receiveTime; + } + + public void setReceiveTime(String receiveTime) { + this.receiveTime = receiveTime; + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRefundQueryResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRefundQueryResult.java new file mode 100644 index 000000000..430288466 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRefundQueryResult.java @@ -0,0 +1,488 @@ +package me.chanjar.weixin.mp.bean.pay.result; + +import com.google.common.collect.Lists; +import com.thoughtworks.xstream.annotations.XStreamAlias; + +import java.util.List; + +/** + *+ * Created by Binary Wang on 2016-11-24. + * @author binarywang(Binary Wang) + *+ */ +@XStreamAlias("xml") +public class WxPayRefundQueryResult extends WxPayBaseResult { + /** + *+ * 设备号 + * device_info + * 否 + * String(32) + * 013467007045764 + * 终端设备号 + */ + @XStreamAlias("device_info") + private String deviceInfo; + + /** + *+ * 微信订单号 + * transaction_id + * 是 + * String(32) + * 1217752501201407033233368018 + * 微信订单号 + */ + @XStreamAlias("transaction_id") + private String transactionId; + + /** + *+ * 商户订单号 + * out_trade_no + * 是 + * String(32) + * 1217752501201407033233368018 + * 商户系统内部的订单号 + */ + @XStreamAlias("out_trade_no") + private String outTradeNo; + + /** + *+ * 订单金额 + * total_fee + * 是 + * Int + * 100 + * 订单总金额,单位为分,只能为整数,详见支付金额 + */ + @XStreamAlias("total_fee") + private Integer totalFee; + + /** + *+ * 应结订单金额 + * settlement_total_fee + * 否 + * Int + * 100 + * 应结订单金额=订单金额-非充值代金券金额,应结订单金额<=订单金额。 + */ + @XStreamAlias("settlement_total_fee") + private Integer settlementTotalFee; + + /** + *+ * 货币种类 + * fee_type + * 否 + * String(8) + * CNY + * 订单金额货币类型,符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型 + */ + @XStreamAlias("fee_type") + private String feeType; + + /** + *+ * 现金支付金额 + * cash_fee + * 是 + * Int + * 100 + * 现金支付金额,单位为分,只能为整数,详见支付金额 + */ + @XStreamAlias("cash_fee") + private Integer cashFee; + + /** + *+ * 退款笔数 + * refund_count + * 是 + * Int + * 1 + * 退款记录数 + */ + @XStreamAlias("refund_count") + private Integer refundCount; + + private ListrefundRecords; + + public String getDeviceInfo() { + return deviceInfo; + } + + public void setDeviceInfo(String deviceInfo) { + this.deviceInfo = deviceInfo; + } + + public String getTransactionId() { + return transactionId; + } + + public void setTransactionId(String transactionId) { + this.transactionId = transactionId; + } + + public String getOutTradeNo() { + return outTradeNo; + } + + public void setOutTradeNo(String outTradeNo) { + this.outTradeNo = outTradeNo; + } + + public Integer getTotalFee() { + return totalFee; + } + + public void setTotalFee(Integer totalFee) { + this.totalFee = totalFee; + } + + public Integer getSettlementTotalFee() { + return settlementTotalFee; + } + + public void setSettlementTotalFee(Integer settlementTotalFee) { + this.settlementTotalFee = settlementTotalFee; + } + + public String getFeeType() { + return feeType; + } + + public void setFeeType(String feeType) { + this.feeType = feeType; + } + + public Integer getCashFee() { + return cashFee; + } + + public void setCashFee(Integer cashFee) { + this.cashFee = cashFee; + } + + public Integer getRefundCount() { + return refundCount; + } + + public void setRefundCount(Integer refundCount) { + this.refundCount = refundCount; + } + + public List getRefundRecords() { + return refundRecords; + } + + public void setRefundRecords(List refundRecords) { + this.refundRecords = refundRecords; + } + + public void composeRefundRecords(String xmlString) { + if (this.refundCount != null && this.refundCount > 0) { + this.refundRecords = Lists.newArrayList(); + //TODO 暂时待实现 + } + } + + public static class RefundRecord { + /** + * + * 商户退款单号 + * out_refund_no_$n + * 是 + * String(32) + * 1217752501201407033233368018 + * 商户退款单号 + *+ */ + @XStreamAlias("out_refund_no") + private String outRefundNo; + + /** + *+ * 微信退款单号 + * refund_id_$n + * 是 + * String(28) + * 1217752501201407033233368018 + * 微信退款单号 + *+ */ + @XStreamAlias("refund_id") + private String refundId; + + /** + *+ * 退款渠道 + * refund_channel_$n + * 否 + * String(16) + * ORIGINAL + * ORIGINAL—原路退款 BALANCE—退回到余额 + *+ */ + @XStreamAlias("refund_channel") + private String refundChannel; + + /** + *+ * 申请退款金额 + * refund_fee_$n + * 是 + * Int + * 100 + * 退款总金额,单位为分,可以做部分退款 + *+ */ + @XStreamAlias("refund_fee") + private String refundFee; + + /** + *+ * 退款金额 + * settlement_refund_fee_$n + * 否 + * Int + * 100 + * 退款金额=申请退款金额-非充值代金券退款金额,退款金额<=申请退款金额 + *+ */ + @XStreamAlias("settlement_refund_fee") + private String settlementRefundFee; + + /** + *+ * 退款资金来源 + * refund_account + * 否 + * String(30) + * REFUND_SOURCE_RECHARGE_FUNDS + * REFUND_SOURCE_RECHARGE_FUNDS---可用余额退款/基本账户, REFUND_SOURCE_UNSETTLED_FUNDS---未结算资金退款 + *+ */ + @XStreamAlias("refund_account") + private String refundAccount; + + /** + *+ * 代金券类型 + * coupon_type_$n + * 否 + * Int + * CASH + * CASH--充值代金券 , NO_CASH---非充值代金券。订单使用代金券时有返回(取值:CASH、NO_CASH)。$n为下标,从0开始编号,举例:coupon_type_$0 + *+ */ + @XStreamAlias("coupon_type") + private String couponType; + + /** + *+ * 代金券退款金额 + * coupon_refund_fee_$n + * 否 + * Int + * 100 + * 代金券退款金额<=退款金额,退款金额-代金券或立减优惠退款金额为现金,说明详见代金券或立减优惠 + *+ */ + @XStreamAlias("coupon_refund_fee") + private String couponRefundFee; + + /** + *+ * 退款代金券使用数量 + * coupon_refund_count_$n + * 否 + * Int + * 1 + * 退款代金券使用数量 ,$n为下标,从0开始编号 + *+ */ + @XStreamAlias("coupon_refund_count") + private String couponRefundCount; + + private ListrefundCoupons; + + /** + * + * 退款状态 + * refund_status_$n + * 是 + * String(16) + * SUCCESS + * 退款状态: + * SUCCESS—退款成功, + * FAIL—退款失败, + * PROCESSING—退款处理中, + * CHANGE—转入代发, + * 退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,资金回流到商户的现金帐号,需要商户人工干预,通过线下或者财付通转账的方式进行退款。 + *+ */ + @XStreamAlias("refund_status") + private String refundStatus; + /** + *+ * 退款入账账户 + * refund_recv_accout_$n + * 是 + * String(64) + * 招商银行信用卡0403 + * 取当前退款单的退款入账方,1)退回银行卡:{银行名称}{卡类型}{卡尾号},2)退回支付用户零钱:支付用户零钱 + *+ */ + @XStreamAlias("refund_recv_accout") + private String refundRecvAccout; + + public String getOutRefundNo() { + return outRefundNo; + } + + public void setOutRefundNo(String outRefundNo) { + this.outRefundNo = outRefundNo; + } + + public String getRefundId() { + return refundId; + } + + public void setRefundId(String refundId) { + this.refundId = refundId; + } + + public String getRefundChannel() { + return refundChannel; + } + + public void setRefundChannel(String refundChannel) { + this.refundChannel = refundChannel; + } + + public String getRefundFee() { + return refundFee; + } + + public void setRefundFee(String refundFee) { + this.refundFee = refundFee; + } + + public String getSettlementRefundFee() { + return settlementRefundFee; + } + + public void setSettlementRefundFee(String settlementRefundFee) { + this.settlementRefundFee = settlementRefundFee; + } + + public String getRefundAccount() { + return refundAccount; + } + + public void setRefundAccount(String refundAccount) { + this.refundAccount = refundAccount; + } + + public String getCouponType() { + return couponType; + } + + public void setCouponType(String couponType) { + this.couponType = couponType; + } + + public String getCouponRefundFee() { + return couponRefundFee; + } + + public void setCouponRefundFee(String couponRefundFee) { + this.couponRefundFee = couponRefundFee; + } + + public String getCouponRefundCount() { + return couponRefundCount; + } + + public void setCouponRefundCount(String couponRefundCount) { + this.couponRefundCount = couponRefundCount; + } + + public ListgetRefundCoupons() { + return refundCoupons; + } + + public void setRefundCoupons(List refundCoupons) { + this.refundCoupons = refundCoupons; + } + + public String getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(String refundStatus) { + this.refundStatus = refundStatus; + } + + public String getRefundRecvAccout() { + return refundRecvAccout; + } + + public void setRefundRecvAccout(String refundRecvAccout) { + this.refundRecvAccout = refundRecvAccout; + } + + public static class RefundCoupon { + /** + * + * 退款代金券批次ID + * coupon_refund_batch_id_$n_$m + * 否 + * String(20) + * 100 + * 退款代金券批次ID ,$n为下标,$m为下标,从0开始编号 + *+ */ + @XStreamAlias("coupon_refund_batch_id") + private String couponRefundBatchId; + + /** + *+ * 退款代金券ID + * coupon_refund_id_$n_$m + * 否 + * String(20) + * 10000 + * 退款代金券ID, $n为下标,$m为下标,从0开始编号 + *+ */ + @XStreamAlias("coupon_refund_id") + private String couponRefundId; + + /** + *+ * 单个退款代金券支付金额 + * coupon_refund_fee_$n_$m + * 否 + * Int + * 100 + * 单个退款代金券支付金额, $n为下标,$m为下标,从0开始编号 + *+ */ + @XStreamAlias("coupon_refund_fee") + private String couponRefundFee; + + public RefundCoupon(String couponRefundBatchId, String couponRefundId, String couponRefundFee) { + this.couponRefundBatchId = couponRefundBatchId; + this.couponRefundId = couponRefundId; + this.couponRefundFee = couponRefundFee; + } + } + + } +} + diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImplTest.java index f31a0e4b9..a312b15d6 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImplTest.java @@ -1,18 +1,17 @@ package me.chanjar.weixin.mp.api.impl; -import me.chanjar.weixin.mp.api.WxMpService; -import org.testng.Assert; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Guice; -import org.testng.annotations.Test; - import com.google.inject.Inject; - import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.bean.menu.WxMenu; import me.chanjar.weixin.common.bean.menu.WxMenuButton; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.ApiTestModule; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.menu.WxMpGetSelfMenuInfoResult; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; /** * 测试菜单 @@ -28,11 +27,22 @@ public class WxMpMenuServiceImplTest { protected WxMpService wxService; @Test(dataProvider = "menu") - public void testCreateMenu(WxMenu wxMenu) throws WxErrorException { + public void testMenuCreate(WxMenu wxMenu) throws WxErrorException { System.out.println(wxMenu.toJson()); this.wxService.getMenuService().menuCreate(wxMenu); } + @Test + public void testMenuTryMatch() throws Exception { + //TODO + } + + @Test + public void testGetSelfMenuInfo() throws Exception { + WxMpGetSelfMenuInfoResult selfMenuInfo = this.wxService.getMenuService().getSelfMenuInfo(); + System.out.println(selfMenuInfo); + } + @Test public void testCreateMenu2() throws WxErrorException { String a = "{\n" @@ -77,15 +87,15 @@ public class WxMpMenuServiceImplTest { this.wxService.getMenuService().menuCreate(menu); } - @Test(dependsOnMethods = { "testCreateMenu"}) - public void testGetMenu() throws WxErrorException { + @Test(dependsOnMethods = { "testMenuCreate"}) + public void testMenuGet() throws WxErrorException { WxMenu wxMenu = this.wxService.getMenuService().menuGet(); Assert.assertNotNull(wxMenu); System.out.println(wxMenu.toJson()); } - @Test(dependsOnMethods = { "testGetMenu"}) - public void testDeleteMenu() throws WxErrorException { + @Test(dependsOnMethods = { "testMenuGet"}) + public void testMenuDelete() throws WxErrorException { this.wxService.getMenuService().menuDelete(); } diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java index b4e22f115..7b2a9dea4 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java @@ -9,9 +9,7 @@ import me.chanjar.weixin.mp.bean.pay.request.WxEntPayRequest; import me.chanjar.weixin.mp.bean.pay.request.WxPayRefundRequest; import me.chanjar.weixin.mp.bean.pay.request.WxPaySendRedpackRequest; import me.chanjar.weixin.mp.bean.pay.request.WxPayUnifiedOrderRequest; -import me.chanjar.weixin.mp.bean.pay.result.WxPayRefundResult; -import me.chanjar.weixin.mp.bean.pay.result.WxPaySendRedpackResult; -import me.chanjar.weixin.mp.bean.pay.result.WxPayUnifiedOrderResult; +import me.chanjar.weixin.mp.bean.pay.result.*; import org.testng.annotations.Guice; import org.testng.annotations.Test; @@ -20,6 +18,7 @@ import java.io.File; /** * 测试支付相关接口 * Created by Binary Wang on 2016/7/28. + * * @author binarywang (https://github.com/binarywang) */ @Test @@ -34,6 +33,9 @@ public class WxMpPayServiceImplTest { } + /** + * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#refund(WxPayRefundRequest, File)} . + */ @Test public void testRefund() throws Exception { WxPayRefundRequest request = new WxPayRefundRequest(); @@ -46,33 +48,64 @@ public class WxMpPayServiceImplTest { System.err.println(result); } + + /** + * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#refundQuery(String, String, String, String)} . + */ + @Test + public void testRefundQuery() throws Exception { + WxPayRefundQueryResult result = this.wxService.getPayService().refundQuery("1", "", "", ""); + result = this.wxService.getPayService().refundQuery("", "2", "", ""); + System.err.println(result); + result = this.wxService.getPayService().refundQuery("", "", "3", ""); + System.err.println(result); + result = this.wxService.getPayService().refundQuery("", "", "", "4"); + System.err.println(result); + //测试四个参数都填的情况,应该报异常的 + result = this.wxService.getPayService().refundQuery("1", "2", "3", "4"); + System.err.println(result); + } + @Test public void testCheckJSSDKCallbackDataSignature() throws Exception { } + /** + * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#sendRedpack(WxPaySendRedpackRequest, File)} . + */ @Test public void testSendRedpack() throws Exception { WxPaySendRedpackRequest request = new WxPaySendRedpackRequest(); request.setActName("abc"); request.setClientIp("aaa"); - request.setMchBillno("aaaa"); + request.setMchBillNo("aaaa"); request - .setReOpenid(((WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage()).getOpenid()); + .setReOpenid(((WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage()).getOpenid()); File keyFile = new File("E:\\dlt.p12"); WxPaySendRedpackResult redpackResult = this.wxService.getPayService().sendRedpack(request, keyFile); System.err.println(redpackResult); } + /** + * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#queryRedpack(String, File)}. + */ + @Test + public void testQueryRedpack() throws Exception { + File keyFile = new File("E:\\dlt.p12"); + WxPayRedpackQueryResult redpackResult = this.wxService.getPayService().queryRedpack("aaaa", keyFile); + System.err.println(redpackResult); + } + /** * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#unifiedOrder(WxPayUnifiedOrderRequest)}. */ @Test public void testUnifiedOrder() throws WxErrorException { WxPayUnifiedOrderResult result = this.wxService.getPayService() - .unifiedOrder(WxPayUnifiedOrderRequest.builder().body("1111111") - .totalFee(1).spbillCreateIp("111111").notifyURL("111111") - .tradeType("JSAPI").openid("122").outTradeNo("111111").build()); + .unifiedOrder(WxPayUnifiedOrderRequest.builder().body("1111111") + .totalFee(1).spbillCreateIp("111111").notifyURL("111111") + .tradeType("JSAPI").openid("122").outTradeNo("111111").build()); System.err.println(result); } diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java index ee975181f..b37278e23 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java @@ -39,9 +39,10 @@ public class WxMpTemplateMsgServiceImplTest { .toUser(configStorage.getOpenid()) .templateId(configStorage.getTemplateId()).build(); templateMessage.addWxMpTemplateData( - new WxMpTemplateData("first", dateFormat.format(new Date()))); + new WxMpTemplateData("first", dateFormat.format(new Date()),"#FF00FF")); templateMessage.addWxMpTemplateData( new WxMpTemplateData("remark", RandomStringUtils.randomAlphanumeric(100), "#FF00FF")); + templateMessage.setUrl(" "); String msgId = this.wxService.getTemplateMsgService().sendTemplateMsg(templateMessage); Assert.assertNotNull(msgId); System.out.println(msgId); diff --git a/weixin-java-osgi/pom.xml b/weixin-java-osgi/pom.xml index 3833499cf..ec9d1b7d0 100644 --- a/weixin-java-osgi/pom.xml +++ b/weixin-java-osgi/pom.xml @@ -6,7 +6,7 @@com.github.binarywang weixin-java-parent -2.4.0-SNAPSHOT +2.5.0-SNAPSHOT weixin-java-osgi