V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
工单节点使用指南
• 请用平和的语言准确描述你所遇到的问题
• 厂商的技术支持和你一样也是有喜怒哀乐的普通人类,尊重是相互的
• 如果是关于 V2EX 本身的问题反馈,请使用 反馈 节点
Ziav

编写官方微信支付 Java SDK 的同学领下工单!

  •  
  •   Ziav · Jul 5, 2018 · 5911 views
    This topic created in 2858 days ago, the information mentioned may be changed or developed.

    由于昨天微信被爆官方的 Java SDK 存在支付漏洞,于是今天官方就放出了最新的 SDK。刚好正在接支付这块,立马就 down 了最新的 SDK,maven install,然后项目引入。然后项目就报错了。。。看到里面各种奇葩的写法,让我对鹅厂的 Java 水平表示严重的怀疑。

    首先,更新后多了一个 IWXPayDomain 接口,BUT,里面定义的 abstract 是什么鬼??这特么到是接口还是抽象类???真是我孤陋寡闻了,第一次见到这么神奇的写法。

    package com.github.wxpay.sdk;
    
    /**
     * 域名管理,实现主备域名自动切换
     */
    public abstract interface IWXPayDomain {
        /**
         * 上报域名网络状况
         * @param domain 域名。 比如:api.mch.weixin.qq.com
         * @param elapsedTimeMillis 耗时
         * @param ex 网络请求中出现的异常。
         *           null 表示没有异常
         *           ConnectTimeoutException,表示建立网络连接异常
         *           UnknownHostException, 表示 dns 解析异常
         */
        abstract void report(final String domain, long elapsedTimeMillis, final Exception ex);
    
        /**
         * 获取域名
         * @param config 配置
         * @return 域名
         */
        abstract DomainInfo getDomain(final WXPayConfig config);
    
        static class DomainInfo{
            public String domain;       //域名
            public boolean primaryDomain;     //该域名是否为主域名。例如:api.mch.weixin.qq.com 为主域名
            public DomainInfo(String domain, boolean primaryDomain) {
                this.domain = domain;
                this.primaryDomain = primaryDomain;
            }
    
            @Override
            public String toString() {
                return "DomainInfo{" +
                        "domain='" + domain + '\'' +
                        ", primaryDomain=" + primaryDomain +
                        '}';
            }
        }
    
    }
    

    然后,接下来神奇的地方来了,原来的 WXPayConfig 接口改成了抽象类,然鹅。。。里面抽象方法的访问控制权限是 default ??额。。你让别人怎么在不同的 package 下 Override 这个抽象类???

    public abstract class WXPayConfig {
    
    
    
        /**
         * 获取 App ID
         *
         * @return App ID
         */
        abstract String getAppID();
    
    
        /**
         * 获取 Mch ID
         *
         * @return Mch ID
         */
        abstract String getMchID();
    
    
        /**
         * 获取 API 密钥
         *
         * @return API 密钥
         */
        abstract String getKey();
    
    
        /**
         * 获取商户证书内容
         *
         * @return 商户证书内容
         */
        abstract InputStream getCertStream();
    }
    

    欢迎鉴赏,SDK 下载地址: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

    6 replies    2018-07-06 09:51:08 +08:00
    ingin
        1
    ingin  
       Jul 5, 2018 via Android   ❤️ 1
    心平气和点,你写的东西让他们看,你会被喷死的!
    Ziav
        2
    Ziav  
    OP
       Jul 5, 2018 via Android
    @ingin 就事论事而已,写的不好被喷很正常
    zpxshl
        3
    zpxshl  
       Jul 5, 2018 via Android
    abstract interface ...这怎么过 cr 的......
    rubycedar
        4
    rubycedar  
       Jul 6, 2018 via iPhone
    @zpxshl 反正在编译的时候会简化,怕什么? [手动滑稽
    Mogugugugu
        5
    Mogugugugu  
       Jul 6, 2018 via Android
    企鹅家的 JAVA 并不是长项,很有可能是 C++ 或者某些语言的人过来临时凑个数写的。。。
    doudouwu
        6
    doudouwu  
       Jul 6, 2018
    abstract interface 编译后就是 interface ?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2435 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 04:08 · PVG 12:08 · LAX 21:08 · JFK 00:08
    ♥ Do have faith in what you're doing.