V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
工单节点使用指南
• 请用平和的语言准确描述你所遇到的问题
• 厂商的技术支持和你一样也是有喜怒哀乐的普通人类,尊重是相互的
• 如果是关于 V2EX 本身的问题反馈,请使用 反馈 节点
Ziav
V2EX  ›  全球工单系统

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

  •  
  •   Ziav · 2018-07-05 21:51:15 +08:00 · 5185 次点击
    这是一个创建于 2370 天前的主题,其中的信息可能已经有所发展或是发生改变。

    由于昨天微信被爆官方的 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 条回复    2018-07-06 09:51:08 +08:00
    ingin
        1
    ingin  
       2018-07-05 22:34:02 +08:00 via Android   ❤️ 1
    心平气和点,你写的东西让他们看,你会被喷死的!
    Ziav
        2
    Ziav  
    OP
       2018-07-05 22:45:11 +08:00 via Android
    @ingin 就事论事而已,写的不好被喷很正常
    zpxshl
        3
    zpxshl  
       2018-07-05 23:45:29 +08:00 via Android
    abstract interface ...这怎么过 cr 的......
    rubycedar
        4
    rubycedar  
       2018-07-06 03:53:27 +08:00 via iPhone
    @zpxshl 反正在编译的时候会简化,怕什么? [手动滑稽
    Mogugugugu
        5
    Mogugugugu  
       2018-07-06 08:50:20 +08:00 via Android
    企鹅家的 JAVA 并不是长项,很有可能是 C++ 或者某些语言的人过来临时凑个数写的。。。
    doudouwu
        6
    doudouwu  
       2018-07-06 09:51:08 +08:00
    abstract interface 编译后就是 interface ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1016 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:51 · PVG 03:51 · LAX 11:51 · JFK 14:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.