Giter VIP home page Giter VIP logo

weixin-popular's Introduction

weixin-popular

Maven Central GitHub release License

微信 JAVA SDK,是微信平台(公众平台、开放平台、商户平台、服务商平台)接口服务的JAVA 实现,开发 严格按照官方技术文档,合理划分包名、定义字段及方法,能胜任任何微信相关的业务。

==============

使用建议

先查看官方文档,理解交互逻辑,再查看下文的 example。

==============

weixin-popular 已支持的微信平台

  • 公众平台(订阅号、服务号、小程序)
  • 开放平台(网页应用、移动应用、公众号第三方平台开发)
  • 商户平台 (支付)
  • 服务商平台(代支付)

maven

<dependency>
  <groupId>com.github.liyiorg</groupId>
  <artifactId>weixin-popular</artifactId>
  <version>2.8.32</version>
</dependency>

API 列表

待开发API

API调用模式

EMOJI 表情

日志记录

  • 2.7.0+ 版本后增加日志记录
  • API 日志记录,info 级别。
  • 日志基于slf4j,请选择依赖合适的slf4j实现包。

工具类

  • PayUtil 支付工具类,生成JS支付,原生支付
  • SignatureUtil 签权生成、验证
  • XMLConverUtil XML 对象转换(JAXB)
  • JsUtil JsAPI config,chooseWXPay JSON生成
  • WxaUtil 小程序用户信息解密、校验

example

support

激励一下

微信扫一扫

参考资料

weixin-popular's People

Contributors

727288151 avatar akimizu1994 avatar asdtiang avatar binary-zeroone avatar declan94 avatar gordianyuan avatar huizhong avatar kjstart avatar liuemc avatar liyiorg avatar menng avatar moyq5 avatar rachelliqian avatar swang321 avatar yanickxia avatar yazgoo avatar yililiangbaikai avatar zhzhlxhh avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

weixin-popular's Issues

关于统一下单中detail的问题

@liyiorg 你好,我在统一下单时遇到了如下问题:
我把detail相关信息增加到里面之后微信端提示有误,然后我去掉detail信息就又可以了。
所以想问下这个detail信息中参数是否有误,或者是detail中字段的来源是从哪儿获知的,我在微信开发文档中没有找到这块的描述。
因为微信扫码时就提示的是参数有问题。
麻烦解答下,谢谢

没注释看的头疼

以前版本也是用你这个 挺好用的,以前版本有方法注释 怎么现在都没了呢。

微信公众平台接入

ReceiveServlet中对验证的顺序与官方文档不符:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

上传视频乱码,以及视频过大无法上传

1,MaterialAPI.add_material 方法上传的视频,会出现乱码。
multipartEntityBuilder.addTextBody("description", JsonUtil.toJSONString(description)); 改为multipartEntityBuilder.addTextBody("description", JsonUtil.toJSONString(description), ContentType.create("text/plain", CHARSET_UTF8)); 之后 才正常显示。

2,上传几百k的视频没问题, 但是上传手机拍摄的mp4,视频大小为1.5M 1秒, 4M 2秒, 9M 4秒 , 15M 11秒 均报错:
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)

maven 编译不通过

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project weixin-popular: Compilation failure: Compilation failure:
[ERROR] \github\weixin-popular\src\main\java\weixin\popular\util\XMLConverUtil.java:[3,43] 错误: 程序包com.sun.xml.internal.bind.marshaller不存在
[ERROR] \github\weixin-popular\src\main\java\weixin\popular\util\XMLConverUtil.java:[90,39] 错误: 找不到符号
[ERROR] \github\weixin-popular\src\main\java\weixin\popular\util\XMLConverUtil.java:[90,83] 错误: 找不到符号

红包接口微信返回的错误信息乱码

红包发送接口,微信返回的错误信息乱码,

PayMchAPI.mmpaymkttransfersSendredpack调用返回的SendredpackResult对象乱码

"err_code_des":"????:re_openid?????,???????"

关于BaseAPI中getATPN方法

方法中return值为return "access_token" or "authorizer_access_token"
但是对于第三方模式下,貌似参数也是"access_token",并非 "authorizer_access_token"
@liyiorg

wx.config配置问题

String jsapi_ticket = TicketManager.getTicket(appId);
String configjson = JsUtil.generateConfigJson(jsapi_ticket, false, appId, url, jsApiList);

调用上面方法返回的configjson,直接配置 wx.config(configjson),提示'config:fail'错误,怎么解决此问题

微信接收消息的类型或事件是类型,有封装么?

如题,微信接收消息的类型或事件是类型,在代码中有相应的类进行封装么?具体在哪个包下啊?
昨天刚开始用,接收了几种类型的消息,image,text等,不知道有没有写好的类。还是说自己手动给封装一下啊?
别外,还有好多api,文档比较少

PayMchAPI.payUnifiedorder 接口中 unifiedorder.setBody(中文),无法验证签名通过

Unifiedorder unifiedorder = new Unifiedorder();
unifiedorder.setAppid(appid);
unifiedorder.setMch_id(mch_id);
unifiedorder.setNonce_str(UUID.randomUUID().toString().replace("-", ""));
//body中数据设置为中文时,无法验证签名通过
unifiedorder.setBody("商品信息");
unifiedorder.setOut_trade_no("123456");
unifiedorder.setTotal_fee("1");//单位分
unifiedorder.setSpbill_create_ip(request.getRemoteAddr());//IP
unifiedorder.setNotify_url("http://mydomain.com/test/notify");
unifiedorder.setTrade_type("JSAPI");//JSAPI,NATIVE,APP,WAP

    UnifiedorderResult unifiedorderResult = PayMchAPI.payUnifiedorder(unifiedorder,key);

    String json = PayUtil.generateMchPayJsRequestJson(unifiedorderResult.getPrepay_id(), appid, key);

mvn compile error

[ERROR] F:\weixin-popular-master\src\main\java\weixin\popular\util\XMLConverUtil.java:[18,43] 错误: 程序包com.sun.xml.internal.bind.marshaller不存在

发现ApiGetAuthorizerInfoResult类中的bug

weixin.popular.bean.component.ApiGetAuthorizerInfoResult 类中有个 qrcode_url 字段,应该是属于Authorizer_info 中的字段。

微信文档那边就写错了。所以按你现在ApiGetAuthorizerInfoResult 中的写法是拿不到值的。

PayUtil.generateMchPayJsRequestJson生成的timeStamp字段有问题

微信支付请求新版在JSSDK端要求timestamp必须是全小写。
而PayJsRequest对象里的timeStamp是驼峰式命名法。

参考下列微信文档:

wx.chooseWXPay({
timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: '', // 支付签名随机串,不长于 32 位
package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: '', // 支付签名
success: function (res) {
// 支付成功后的回调函数
}
});

关于微信支付MCH 问题

现在遇到一个问题就是商户签名错误,用了官网的签名验证工具发现生成的paySign和你的SDK生成的不一样,我不知道我SDK用的对不对,能否贴出一个示例?

提交一个MCH退款申请的改进

这个问题不知道是我使用API的问题, 还是的确你们没有注意到, 在MCH退款申请的时候需要双向HTTPS双向认证, 其中还会用到私钥文件.

不知道这里怎么代码格式化, 请自行复制再修改

修改如下(建议)
在HttpClientFactory增加如下方法(此方法为官方文档中的代码)

   public static CloseableHttpClient createSslHttpClient() {
    KeyStore keyStore;
    try {
        keyStore = KeyStore.getInstance("PKCS12");
        FileInputStream instream = new FileInputStream(new File(WxwebConfig.PKCS12_FILE));//这里是私钥文件
        try {
            keyStore.load(instream, WxwebConfig.MCH_ID.toCharArray());
        } finally {
            instream.close();
        }
        SSLContext sslcontext = SSLContexts
                .custom()
                .loadKeyMaterial(keyStore, WxwebConfig.MCH_ID.toCharArray())
                .build();
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                sslcontext,
                new String[] { "TLSv1" },
                null,
                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
        CloseableHttpClient httpclient = HttpClients.custom()
                .setSSLSocketFactory(sslsf).build();
        return httpclient;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

在进行退款申请的时候要用此方法构建CloseableHttpClient , 大致代码如下
/**
* 退款申请
*
* 注意:
* 1.交易时间超过1 年的订单无法提交退款;
* 2.支持部分退款,部分退需要设置相同的订单号和不同的out_refund_no。一笔退款失
* 败后重新提交,要采用原来的out_refund_no。总退款金额不能超过用户实际支付金额。
* @param secapiPayRefund
* @param key 商户支付密钥
* @return
*/

public static SecapiPayRefundResult secapiPayRefund(SecapiPayRefund secapiPayRefund,String key){
    Map<String,String> map = MapUtil.objectToMap( secapiPayRefund);
    String sign = SignatureUtil.generateSign(map,key);
    secapiPayRefund.setSign(sign);
    String secapiPayRefundXML = XMLConverUtil.convertToXML( secapiPayRefund);
    HttpUriRequest httpUriRequest = RequestBuilder.post()
            .setHeader(xmlHeader)
            .setUri(MCH_URI + "/secapi/pay/refund")
            .setEntity(new StringEntity(secapiPayRefundXML,Charset.forName("utf-8")))
            .build();
            //此为原始代码
    //return LocalHttpClient.executeXmlResult(httpUriRequest,SecapiPayRefundResult.class);
            //此为建议更新的代码
    CloseableHttpClient hc = HttpClientFactory.createSslHttpClient();
    try {
        return ((SecapiPayRefundResult) hc.execute(httpUriRequest, XmlResponseHandler.createResponseHandler(SecapiPayRefundResult.class)));
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

关于使用企业付款时的OPENID_ERROR问题

请问在使用PayMchAPI的mmpaymkttransfersPromotionTransfers时有没有遇到OPENID_ERROR (openid和appid不匹配)的问题 :)

我在使用时已确保该openid账号已经关注了该公众账号,调用代码如下,但是一直提示OPENID_ERROR (openid和appid不匹配)

    Transfers transfers = new Transfers();

    transfers.setMch_appid("wx9d154566xxxxxxx");
    transfers.setMchid("xxxxxxxxx");
    transfers.setOpenid("olEows2vTZxKZ6z3eavTDsfOky5k");
    transfers.setNonce_str(MRandomUtils.generateString(32));
    transfers.setPartner_trade_no(MDateUtils.generateOrderNO());
    transfers.setCheck_name("NO_CHECK");
    transfers.setAmount("100");
    transfers.setDesc("约会退款");
    transfers.setSpbill_create_ip("xx.xx.xx.xx");

    LocalHttpClient.initMchKeyStore("12345678", p12_file);

    TransfersResult result = PayMchAPI.mmpaymkttransfersPromotionTransfers(
            transfers, key);

多谢!

在使用jackson解析的地方,如果微信返回值增加了字段,会解析失败。

例如:
SnsAPI snsAPI = new SnsAPI();
User user = snsAPI.userinfo(accessToken, openId, lang);

这个接口,现在微信返回多了unionid这个字段,程序报错:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "unionid" (class weixin.popular.bean.User), not marked as ignorable (13 known properties: "subscribe_time", "openid", "sex", "subscribe", "city", "headimgurl", "nickname", "province", "privilege", "errcode", "country", "language", "errmsg"])

unifiedorderResult.getPrepay_id() = null 怎么处理??

// 统一下单,生成预支付订单
UnifiedorderResult unifiedorderResult = PayMchAPI.payUnifiedorder(unifiedorder,key);
String json = PayUtil.generateMchPayJsRequestJson(unifiedorderResult.getPrepay_id(), appid, key);

我运行的时候 unifiedorderResult.getPrepay_id() 取得 null, 应该怎么除错 ??

setBody中文导致签名错误的解决方法

看了#20 #11 的提问,发现问题还是没解决。

自己在调试中发现是 weixin.popular.util.SignatureUtil 这个class 下边的签名方法所致

/**
     * 生成sign MD5 加密 toUpperCase
     * @param map map
     * @param paternerKey paternerKey
     * @return sign
     */
    public static String generateSign(Map<String, String> map,String paternerKey){
        Map<String, String> tmap = MapUtil.order(map);
        if(tmap.containsKey("sign")){
            tmap.remove("sign");
        }
        String str = MapUtil.mapJoin(tmap, false, false);
        return DigestUtils.md5Hex(str+"&key="+paternerKey).toUpperCase();
    }

修改如下:
DigestUtils.md5Hex(str+"&key="+paternerKey) => DigestUtils.md5Hex((str+"&key="+paternerKey).getBytes("UTF-8"))

希望 @liyiorg 在下个版本解决下。

ComponentAccessToken管理

只有TokenManager,可以补一个ComponentAccessTokenManager来管理第三方平台的access_token

连续调用任何API方法,第二次调用都报fail to respond

两次微信接口调用之间如果间隔超过2秒,都能成功返回。如果第一次和第二次间隔时间很短,第二次就会报org.apache.http.NoHttpResponseException: api.weixin.qq.com:443 failed to respond
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:143)
从1月7日起出现这个情况。
请问是什么原因?

微信支付加了一个MCH,怎么破

微信支付的规则又改了,增加了MCH_ID(商户号),看上去是去掉了paySignkey,要求在请求前先生成preOrderId,再供JSREQUEST调用。

希望G主早日更新。

ticket刷新

/**
* 初始化ticket(jsapi) 刷新,每119分钟刷新一次。

* 依赖TokenManager
* @param appid appid
/
public static void init(final String appid){
init(appid,0,60
119);
}

这里刷新 为什么是119分钟 微信不是 文档不是说7200秒么 是我理解有吴还是什么问题

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.