diff --git a/README.md b/README.md index 8b6992b6..fcf5184d 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,6 @@ weixin4j 微信开发工具包 ------------- - -项目说明 -------- > `weixin4j`是一个用java编写针对微信开发的工具包,包含[weixin4j-mp](./weixin4j-mp)(微信公众平台API)、[weixin4j-qy](./weixin4j-qy)(微信企业号API)以及[weixin4j-server](./weixin4j-server)(微信被动消息服务器)三个工程. 功能列表 diff --git a/weixin4j-base/pom.xml b/weixin4j-base/pom.xml index c00c1be0..2241d437 100644 --- a/weixin4j-base/pom.xml +++ b/weixin4j-base/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 com.foxinmy diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/MediaType.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/MediaType.java index b4195132..daca3d44 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/MediaType.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/MediaType.java @@ -3,7 +3,7 @@ package com.foxinmy.weixin4j.type; /** * 上传的媒体类型
*

- * 公众平台上传限制:
图片(image): 128K,支持JPG格式
+ * 公众平台上传限制:
图片(image): 128K,支持JPG,PNG格式
* 语音(voice):256K,播放长度不超过60s,支持AMR\MP3格式
视频(video):1MB,支持MP4格式
* 缩略图(thumb):64KB,支持JPG格式
*

diff --git a/weixin4j-mp/pom.xml b/weixin4j-mp/pom.xml index ea851cb6..e7c33000 100644 --- a/weixin4j-mp/pom.xml +++ b/weixin4j-mp/pom.xml @@ -31,21 +31,6 @@ org.apache.poi poi-ooxml ${poi.version} - - - commons-codec - commons-codec - - - dom4j - dom4j - - - - - org.slf4j - slf4j-api - ${jcl.version} jaxen diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/util/PayDemo.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/util/PayDemo.java deleted file mode 100644 index f49fc821..00000000 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/util/PayDemo.java +++ /dev/null @@ -1,323 +0,0 @@ -package com.foxinmy.weixin4j.mp.util; - -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.foxinmy.weixin4j.exception.PayException; -import com.foxinmy.weixin4j.http.XmlResult; -import com.foxinmy.weixin4j.model.Consts; -import com.foxinmy.weixin4j.mp.model.WeixinMpAccount; -import com.foxinmy.weixin4j.mp.payment.JsPayNotify; -import com.foxinmy.weixin4j.mp.payment.PayPackage; -import com.foxinmy.weixin4j.mp.payment.PayUtil; -import com.foxinmy.weixin4j.mp.payment.conver.CouponConverter; -import com.foxinmy.weixin4j.mp.payment.v2.NativePayNotifyV2; -import com.foxinmy.weixin4j.mp.payment.v2.NativePayResponseV2; -import com.foxinmy.weixin4j.mp.payment.v2.PayFeedback; -import com.foxinmy.weixin4j.mp.payment.v2.PayPackageV2; -import com.foxinmy.weixin4j.mp.payment.v2.PayWarn; -import com.foxinmy.weixin4j.mp.payment.v3.NativePayNotifyV3; -import com.foxinmy.weixin4j.mp.payment.v3.NativePayResponseV3; -import com.foxinmy.weixin4j.mp.payment.v3.PayPackageV3; -import com.foxinmy.weixin4j.mp.type.TradeType; -import com.foxinmy.weixin4j.util.ConfigUtil; -import com.foxinmy.weixin4j.util.StringUtil; -import com.foxinmy.weixin4j.xml.XmlStream; - -/** - * 支付示例 - * - * @className PayDemo - * @author jy - * @date 2014年10月28日 - * @since JDK 1.7 - * @see - */ -public final class PayDemo { - - private final Logger log = LoggerFactory.getLogger(getClass()); - - /** - * JSAPI支付 - * - * @return - */ - public JSONObject jsPay() { - JSONObject obj = new JSONObject(); - WeixinMpAccount weixinAccount = JSON.parseObject( - ConfigUtil.getValue("account"), WeixinMpAccount.class); - // V3 支付 - PayPackage payPackage = new PayPackageV3(weixinAccount, "用户openid", - "商品描述", "系统内部订单号", 1d, "IP地址", TradeType.JSAPI); - // V2 支付 - payPackage = new PayPackageV2("商品描述", weixinAccount.getPartnerId(), - "系统内部订单号", 1d, "回调地址", "IP地址"); - payPackage.setAttach("ID"); - String jspay = null; - try { - jspay = PayUtil.createPayJsRequestJson(payPackage, weixinAccount); - } catch (PayException e) { - log.error("create jspay error,{}", weixinAccount, e); - } - if (StringUtil.isBlank(jspay)) { - obj.put("code", "-2"); - obj.put("msg", "创建支付链接失败!"); - return obj; - } - obj.put("code", "0"); - obj.put("jspay", jspay); - - /* - * 编辑收货地址 SnsToken token = (SnsToken) getSession("AccessToken"); - * obj.put("editaddress", PayUtil.createAddressRequestJson( - * wx.getAppId(), getFullLoction(), token.getAccess_token())); - */ - log.info("js pay....{}", obj); - return obj; - } - - /** - * JSAPI(V2)支付成功(前端)时的回调通知
- * <xml>
<OpenId><![CDATA[111222]]></OpenId>
- * <AppId><![CDATA[wwwwb4f85f3a797777]]></AppId>
- * <IsSubscribe>1</IsSubscribe>
- * <TimeStamp>1369743511</TimeStamp>
- * <NonceStr><![CDATA[jALldRTHAFd5Tgs5]]></NonceStr>
- * <AppSignature><![CDATA[bafe07f060f22dcda0bfdb4b5ff756f973aecffa]]> - * </AppSignature>
- * <SignMethod><![CDATA[sha1]]></SignMethod>
</xml>
- * 参与签名的字段为: appid、appkey、timestamp、noncestr、openid、issubscribe - * - * @param 订单信息 - * @param inputStream - * 用户信息 - * - * @see com.foxinmy.weixin4j.mp.payment.JsPayNotify - * @return success或其他 - */ - public String jsNotifyV2(InputStream inputStream) { - Map objMap = new HashMap(); - /* - * 收集url中携带的参数 /pay/notify/back?attach=8&bank_billno=201410293351060& - * bank_type=2032&discount=0&fee_type=1&input_charset=UTF-8& - * notify_id=9fKbVf_qg6y- - * wSjtSMV0PLXeEn2oGfTM1s9dWSvR2B9U6iFQRTzmjrMWKUxvh9mpBLvnh8aqFbC_OFk1pTvFnFUO00Lln4fh - * & out_trade_no=D14102900031&partner=1221928801&product_fee=1& - * sign=B9D6E772C271C9B86B8436FC9F5DFC1A& - * sign_type=MD5&time_end=20141029183707& - * total_fee=1&trade_mode=1&trade_state=0& - * transaction_id=1221928801201410296039230054&transport_fee=0 - */ - log.info("jspay_notify_orderinfo,{}", objMap); - JsPayNotify payNotify = XmlStream.get(inputStream, JsPayNotify.class); - log.info("jspay_notify_userinfo,{}", payNotify); - WeixinMpAccount weixinAccount = JSON.parseObject( - ConfigUtil.getValue("account"), WeixinMpAccount.class); - // 验证财付通签名 - String sign = objMap.get("sign"); - objMap.remove("sign"); - String _sign = PayUtil - .paysignMd5(objMap, weixinAccount.getPartnerKey()); - log.info("财付通签名----->sign={},vaild_sign={}", sign, _sign); - if (!sign.equals(_sign)) { - return "fail"; - } - objMap.clear(); - // 验证微信签名 - sign = payNotify.getPaySign(); - payNotify.setPaySign(null); - payNotify.setSignType(null); - String vaild_sign = PayUtil.paysignSha(payNotify, - weixinAccount.getPaySignKey()); - log.info("微信签名----->sign={},vaild_sign={}", sign, vaild_sign); - if (!sign.equals(vaild_sign)) { - return "fail"; - } - // 处理业务逻辑 - return "success"; - } - - /** - * JSAPI(V3)支付成功(前端)时的回调通知 - * - * - * @param inputStream - * 订单回调 - * @return <xml>
- * <return_code>SUCCESS/FAIL</return_code>
- * <return_msg>如非空,为错误 原因签名失败参数格式校验错误</return_msg>
- * </xml> - * @throws DocumentException - * @see 支付结果通知 - */ - public String jsNotifyV3(InputStream inputStream) { - String orderXml = "从inputStream中读取订单信息"; - com.foxinmy.weixin4j.mp.payment.v3.Order order = CouponConverter - .fromXML(orderXml, - com.foxinmy.weixin4j.mp.payment.v3.Order.class); - log.info("jsapi_notify_order_info:", order); - String sign = order.getSign(); - order.setSign(null); - WeixinMpAccount weixinAccount = JSON.parseObject( - ConfigUtil.getValue("account"), WeixinMpAccount.class); - String valid_sign = PayUtil.paysignMd5(order, - weixinAccount.getPaySignKey()); - // 如果订单中存在代金券的情况并不适用 - log.info("微信签名----->sign={},vaild_sign={}", sign, valid_sign); - if (!sign.equals(valid_sign)) { - return XmlStream.to(new XmlResult(Consts.FAIL, "签名错误")); - } - // 处理业务逻辑 - return XmlStream.to(new XmlResult(Consts.SUCCESS, "")); - } - - /** - * V2.x版本Native支付时POST数据
- * <xml>
<OpenId><![CDATA[111222]]></OpenId>
- * <AppId><![CDATA[wwwwb4f85f3a797777]]></AppId>
- * <IsSubscribe>1</IsSubscribe>
- * <ProductId>[CDATA[000000]]</ProductId>
- * <TimeStamp>1369743511</TimeStamp>
- * <NonceStr><![CDATA[jALldRTHAFd5Tgs5]]></NonceStr>
- * <AppSignature><![CDATA[bafe07f060f22dcda0bfdb4b5ff756f973aecffa]]> - * </AppSignature>
- * <SignMethod><![CDATA[sha1]]></SignMethod>
</xml>
- * 参与签名的字段为: appid、appkey、timestamp、noncestr、openid、issubscribe、productId - * - * @param inputStream - * - * @return 必须返回一个带有Package信息的xml字符串 - */ - public String nativeNotifyV2(InputStream inputStream) { - // V2.x版本 - NativePayNotifyV2 payNotify = XmlStream.get(inputStream, - NativePayNotifyV2.class); - log.info("native_pay_notify,{}", payNotify); - WeixinMpAccount weixinAccount = JSON.parseObject( - ConfigUtil.getValue("account"), WeixinMpAccount.class); - String sign = payNotify.getPaySign(); - payNotify.setPaySign(null); - payNotify.setSignType(null); - // 验证微信签名 - String vaild_sign = PayUtil.paysignSha(payNotify, - weixinAccount.getPaySignKey()); - log.info("微信签名----->sign={},vaild_sign={}", sign, vaild_sign); - if (!sign.equals(vaild_sign)) { - return "fail"; - } - // 构造订单信息 - PayPackageV2 payPackage = new PayPackageV2("商品描述", - weixinAccount.getPartnerId(), "系统内部订单号", 1d, "回调地址", "IP地址"); - NativePayResponseV2 payResponse = new NativePayResponseV2( - weixinAccount, payPackage); - return XmlStream.to(payResponse); - } - - /** - * V3.x版本native回调
- * <xml>
<openid><![CDATA[111222]]></openid>
- * <appid><![CDATA[wwwwb4f85f3a797777]]></appid>
- * <mch_id><![CDATA[1100022]]></mch_id>
- * <is_subscribe>1</is_subscribe>
- * <product_id>[CDATA[000000]]</product_id>
- * <nonce_str><![CDATA[jALldRTHAFd5Tgs5]]></nonce_str>
- * <sign><![CDATA[bafe07f060f22dcda0bfdb4b5ff756f973aecffa]]> - * </sign>
</xml>
- * - * @return - * @throws PayException - */ - public String nativeNotifyV3(InputStream inputStream) throws PayException { - NativePayNotifyV3 payNotify = XmlStream.get(inputStream, - NativePayNotifyV3.class); - String sign = payNotify.getSign(); - payNotify.setSign(null); - WeixinMpAccount weixinAccount = JSON.parseObject( - ConfigUtil.getValue("account"), WeixinMpAccount.class); - String valid_sign = PayUtil.paysignMd5(payNotify, - weixinAccount.getPaySignKey()); - log.info("微信签名----->sign={},vaild_sign={}", sign, valid_sign); - // 生成Package - PayPackageV3 payPackage = new PayPackageV3(weixinAccount, "用户openid", - "商品描述", "系统内部订单号", 1d, "IP地址", TradeType.NATIVE); - payPackage.setProductId(payNotify.getProductId()); - if (!sign.equals(valid_sign)) { - // 校验失败 - NativePayResponseV3 payReponse = new NativePayResponseV3("签名失败", - null); - payReponse.setSign(PayUtil.paysignMd5(payReponse, - weixinAccount.getPaySignKey())); - return XmlStream.to(payReponse); - - } - // 成功返回 - NativePayResponseV3 payReponse = new NativePayResponseV3(payPackage, - weixinAccount.getPaySignKey()); - payReponse.setSign(PayUtil.paysignMd5(payReponse, - weixinAccount.getPaySignKey())); - return XmlStream.to(payReponse); - } - - /** - * 告警通知 需要成功返回 success
<xml>
- * <AppId><![CDATA[wxf8b4f85f3a794e77]]></AppId>
- * <ErrorType>1001</ErrorType>
- * <Description><![CDATA[错误描述]]></Description>
- * <AlarmContent><![CDATA[错误详情]]></AlarmContent>
- * <TimeStamp>1393860740</TimeStamp>
- * <AppSignature><![CDATA[签名方式跟JsPayRequest中的paySign一样]]></ - * AppSignature>
- * <SignMethod><![CDATA[sha1]]></SignMethod>
- * </xml>
- * 参与签名字段:alarmcontent、appid、appkey、description、errortype、timestamp - * - * @param inputStream - * xml数据 - * @see com.foxinmy.weixin4j.mp.payment.v2.PayWarn - * @return - */ - public String warning(InputStream inputStream) { - PayWarn payWarn = XmlStream.get(inputStream, PayWarn.class); - log.info("pay_warning,{}", payWarn); - WeixinMpAccount weixinAccount = JSON.parseObject( - ConfigUtil.getValue("account"), WeixinMpAccount.class); - String sign = payWarn.getPaySign(); - payWarn.setPaySign(null); - payWarn.setSignType(null); - // 验证微信签名 - String vaild_sign = PayUtil.paysignSha(payWarn, - weixinAccount.getPaySignKey()); - log.info("微信签名----->sign={},vaild_sign={}", sign, vaild_sign); - return "success"; - } - - /** - * 用户维权 - * - * @param inputStream - * @see com.foxinmy.weixin4j.mp.payment.v2.PayFeedback - * @return - */ - public String feedback(InputStream inputStream) { - PayFeedback feedback = XmlStream.get(inputStream, PayFeedback.class); - log.info("pay_feedback_info:{}", feedback); - WeixinMpAccount weixinAccount = JSON.parseObject( - ConfigUtil.getValue("account"), WeixinMpAccount.class); - // 验证微信签名 - Map obj = new HashMap(); - obj.put("openid", feedback.getOpenId()); - obj.put("appid", feedback.getAppId()); - obj.put("timestamp", feedback.getTimeStamp()); - obj.put("appkey", weixinAccount.getPaySignKey()); - String sign = PayUtil.paysignSha(obj); - log.info("微信签名----->sign={},vaild_sign={}", sign, feedback.getPaySign()); - return "success"; - } -} \ No newline at end of file diff --git a/weixin4j-server/README.md b/weixin4j-server/README.md index e36a4937..b65dfa07 100644 --- a/weixin4j-server/README.md +++ b/weixin4j-server/README.md @@ -94,7 +94,7 @@ base on netty. assembly打包(辅助) ----------------- -> [assembly](http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html)是maven的一个打包插件,它可以创建一> 个包含脚本、配置文件以及所有运行时所依赖的元素(jar)assembly插件能帮你构建一个完整的发布包. +> [assembly](http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html)是maven的一个打包插件,它可以创建一个包含脚本、配置文件以及所有运行时所依赖的元素(jar)assembly插件能帮你构建一个完整的发布包. 1.复制[assembly.xml](./src/main/assembly.xml)和[startup.sh](./src/main/startup.sh)到自己工程的src/main目录下.