New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

微信支付的沙箱环境能否使用? #668

Closed
abcfy2 opened this Issue Jul 6, 2018 · 5 comments

Comments

Projects
None yet
2 participants
@abcfy2

abcfy2 commented Jul 6, 2018

我发现这个沙箱环境真是坑爹,只说要调用getSignKey,我发现已经实现这个接口了,调用这个之后就不知道怎么用了,正常请求一直报错:

<return_msg><![CDATA[沙箱验证签名失败,请确认沙箱签名key是否正确(通过getsignkey调用生成)]]></return_msg>

我看了下源码,是否并没有对沙箱环境这个signkey做特殊处理?只是实现了getSignKey接口而已?是否可以把这个逻辑封装进去呢?在WxPayConfig中设置了setUseSandboxEnv(true)之后能否自动处理沙箱环境?

或者在目前的条件下,应该怎么自己处理这个逻辑呢?我遍寻了下微信支付的文档,也没提这个沙箱环境怎么用的,getsignkey之后怎么放入请求中?

@binarywang

This comment has been minimized.

Member

binarywang commented Jul 6, 2018

按照逻辑,应该是你使用沙箱环境前,先要自己手动调用getSignKey生成key,然后把这个key配置到配置文件里,目前setUseSandboxEnv 这个只是用来控制请求接口地址的。
总不能每次调用接口都生成一次key吧?那个生成key的接口不知道是否有次数限制,所以最好的办法就是按我之前所说。

@abcfy2

This comment has been minimized.

abcfy2 commented Jul 6, 2018

我的考虑是本地使用了一个静态缓存。

Groovy Code:

    private static String SANDBOX_SIGN_KEY
    private static final WxPayConfig WX_PAY_CONFIG

    static {
        WX_PAY_CONFIG = new WxPayConfig()
        WX_PAY_CONFIG.setNotifyUrl(NOTIFY_URL)
        WX_PAY_CONFIG.setAppId(APPID)
        WX_PAY_CONFIG.setKeyPath(KEY_PATH)
        WX_PAY_CONFIG.setMchId(MCH_ID)
        WX_PAY_CONFIG.setMchKey(MCH_KEY)
        WX_PAY_CONFIG.setTradeType(TRADE_TYPE)
        WX_PAY_CONFIG.setUseSandboxEnv(USE_SANDBOX_ENV)
        WX_PAY_CONFIG.setSignType(WxPayConstants.SignType.HMAC_SHA256)
    }

    private static <T extends BaseWxPayResult> T withRequest(Closure<T> closure) {
        WxPayService wxPayService = new WxPayServiceImpl()
        wxPayService.setConfig(WX_PAY_CONFIG)

        if (WX_PAY_CONFIG.isUseSandboxEnv) {
            if (!SANDBOX_SIGN_KEY) {
                SANDBOX_SIGN_KEY = wxPayService.getSignKey()
            }

            WX_PAY_CONFIG.setMchKey(SANDBOX_SIGN_KEY)
            wxPayService.setConfig(WX_PAY_CONFIG)
        }

        closure.call(wxPayService)
    }

但是这么写的话发现还是会报同样的错误

@binarywang

This comment has been minimized.

Member

binarywang commented Jul 6, 2018

我记得之前确实沙箱环境确实是没法用的,现在不清楚了,你如果发现走不通,建议还是放弃吧,直接走正式的接口吧

@abcfy2

This comment has been minimized.

abcfy2 commented Jul 6, 2018

好吧,这玩意确实没有使用文档

@abcfy2 abcfy2 closed this Jul 6, 2018

@abcfy2

This comment has been minimized.

abcfy2 commented Aug 1, 2018

阿西吧,总算搞清楚了,无意中看了下微信支付的官方sdk: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

才发现如果启用了沙箱环境,那么SignType只能是MD5,靠。微信支付的sdk源码它就这么写的(在src/main/java/com/github/wxpay/sdk/WXPay.java源码文件中,其中一行就有这个判断)。这个玩意居然在整片官方文档找不到一句话的描述,醉了。

然而更麻烦的还在后面,微信支付的沙箱环境不能随便填金额,使用上比正式环境还麻烦,你必须在微信支付商户接入验收助手这个公众号申请你的验收case,写入验收金额作为use case。一分不能多,一分不能少,否则报错: 沙箱支付金额(1)无效,请检查需要验收的case。微信的接入配置本身就麻烦的要死,很多地方都要超级管理员权限,开发者哪有这玩意……

忍不住再吐槽一下,从未见过微信这么烂的开发环境,文档乱的一P,前后不搭,文档缺失。连个沙箱环境的限制都这么多,比正式环境使用还麻烦,要你何用?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment