Code Monkey home page Code Monkey logo

dromara / payment-spring-boot Goto Github PK

View Code? Open in Web Editor NEW
734.0 19.0 164.0 2.26 MB

微信支付V3支付,支持微信优惠券,代金券、商家券、公众号支付、微信小程序支付、分账、支付分、商家券、合单支付、先享卡、电商收付通等全部微信支付功能API,同时满足服务商、商户开发需求。一键集成,上手快,欢迎star。

License: Apache License 2.0

Java 8.92% HTML 90.94% JavaScript 0.01% CSS 0.13%
payment wechat-pay wechat-sdk wechat-app spring-boot java

payment-spring-boot's Issues

部分JDK报java.security.InvalidKeyException: Illegal key size

Caused by: cn.felord.payment.PayException: java.security.InvalidKeyException: Illegal key size
at cn.felord.payment.wechat.v3.SignatureProvider.decryptResponseBody(SignatureProvider.java:263) ~[payment-spring-boot-autoconfigure-1.0.4.RELEASE.jar!/:na]
at cn.felord.payment.wechat.v3.SignatureProvider.lambda$refreshCertificate$0(SignatureProvider.java:220) ~[payment-spring-boot-autoconfigure-1.0.4.RELEASE.jar!/:na]
at java.lang.Iterable.forEach(Iterable.java:75) ~[na:1.8.0_131]

企业付款到零钱-签名错误

在1.0.5.SNAPSHOT 版本新增的功能-企业付款到零钱,实际业务测试发现,其调用API: wechatApiProvider.transfersApi(tenantId).transfer(transferModel),

如果transferModel的属性在set时包含中文,即调用微信企业付款到零钱接口的请求体xml中包含中文,如下desc;

<xml>
<nonce_str>61a361e764cd5e686242ccde21a705c2</nonce_str>
<sign>E171551509E2F3FDCA4227CDADDE06F2</sign>
<mch_appid>???????????</mch_appid>
<mchid>1576657931</mchid>
<partner_trade_no>1456631111</partner_trade_no>
<openid>???????????</openid>
<check_name>NO_CHECK</check_name>
<amount>100</amount>
<desc>测试呢</desc>
</xml>

则微信接口会返回签名错误,具体原因是编码的问题,需要将 cn/felord/payment/wechat/v2/model/BaseModel.java 的request方法中代码由 header("Content-Type", "application/x-www-form-urlencoded") 设置为 header("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8")

请悉知~

微信支付多租户问题

同一个后台提供支付服务,会有2个租户,当我配置后启动总是报错。

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [cn.felord.payment.wechat.v3.SignatureProvider]: Factory method 'signatureProvider' threw exception; nested exception is cn.felord.payment.PayException: javax.crypto.AEADBadTagException: mac check in GCM failed
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653)
... 93 common frames omitted
Caused by: cn.felord.payment.PayException: javax.crypto.AEADBadTagException: mac check in GCM failed
at cn.felord.payment.wechat.v3.SignatureProvider.decryptResponseBody(SignatureProvider.java:277)
at cn.felord.payment.wechat.v3.SignatureProvider.lambda$refreshCertificate$0(SignatureProvider.java:230)
at java.lang.Iterable.forEach(Iterable.java:75)
at cn.felord.payment.wechat.v3.SignatureProvider.refreshCertificate(SignatureProvider.java:225)
at java.lang.Iterable.forEach(Iterable.java:75)
at cn.felord.payment.wechat.v3.SignatureProvider.(SignatureProvider.java:114)
at cn.felord.payment.wechat.WechatPayConfiguration.signatureProvider(WechatPayConfiguration.java:79)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
... 94 common frames omitted
Caused by: javax.crypto.AEADBadTagException: mac check in GCM failed
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$AEADGenericBlockCipher.doFinal(Unknown Source)
at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source)
at javax.crypto.Cipher.doFinal(Cipher.java:2168)
at cn.felord.payment.wechat.v3.SignatureProvider.decryptResponseBody(SignatureProvider.java:275)
... 105 common frames omitted

配置如下:

微信支付,以下参数均为虚构

wechat:
pay:
v3:
# 租户id
mobile:
# 应用appId 必填
app-id:
# v2 api 密钥 1.0.5版本以后如果用到V2的接口时必填,单纯V3不需要
app-secret:
# api v3 密钥 必填
app-v3-secret:
# 微信支付商户号 必填
mch-id: 1610495767
# 商户服务器域名 用于回调 回调路径为 domain + notifyUrl 需要放开回调接口的安全策略 必填
domain:
# 商户 api 证书路径 必填 填写classpath路径 位于 maven项目的resources文件下
cert-path:
# 租户id
mobilemini:
#服务端小程序
# 应用appId 必填
app-id:
# v2 api 密钥 1.0.5版本以后如果用到V2的接口时必填,单纯V3不需要
app-secret:
# api v3 密钥 必填
app-v3-secret:
# 微信支付商户号 必填
mch-id: 1610495767
# 商户服务器域名 用于回调 回调路径为 domain + notifyUrl 需要放开回调接口的安全策略 必填
domain:
# 商户 api 证书路径 必填 填写classpath路径 位于 maven项目的resources文件下
cert-path:

JSAPI退款回调状态错误

image
此为文档上的状态,
image
此为框架中的退款状态,与文档不一致,导致退款回调时 直接报错
image

微信支付设置订单超时时间报错

PayParams payParams = new PayParams();
payParams.setDescription(content);
//
// 商户侧唯一订单号 建议为商户侧支付订单号 订单表主键 或者唯一标识字段
payParams.setOutTradeNo(outTradeNo);
// 需要定义回调通知
payParams.setNotifyUrl(notifyPath);
Amount amount = new Amount();
amount.setTotal(totalAmount);
payParams.setAmount(amount);
SceneInfo sceneInfo = new SceneInfo();
sceneInfo.setPayerClientIp(ipAddress);
H5Info h5Info = new H5Info();
h5Info.setAppName("xxxxxxxx");
h5Info.setType(H5Info.H5SceneType.Wap);
sceneInfo.setH5Info(h5Info);
payParams.setSceneInfo(sceneInfo);
payParams.setTimeExpire("20220421191948");
WechatResponseEntity h5Pay = wechatApiProvider.directPayApi(tenantId)
.h5Pay(payParams);
调用报错
{"code":"PARAM_ERROR","detail":{"location":"body","value":"20220421191948"},"message":"输入源“/body/time_expire”映射到值字段“交易结束时间”字符串规则校验失败,字符串必须是符合 RFC3339 日期时间格式"}

小程序付款到零钱

{"return_code":"SUCCESS","return_msg":"SIGN_ERROR","mch_appid":"wx15c23f788","mchid":"16010521","result_code":"FAIL","err_code":"SIGN_ERROR","err_code_des":"签名错误"}

支付宝maven打包读取不了证书

运行环境:jdk8,springboot2.1,引入1.0.9版本
idea运行正常,maven打包运行报错
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363)
at cn.felord.payment.alipay.AliPayConfiguration$$EnhancerBySpringCGLIB$$c80d4b48.alipayClient()
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
... 41 common frames omitted

at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622)
... 40 common frames omitted
Caused by: cn.felord.payment.PayException: ali pay app private key is required
at cn.felord.payment.alipay.AliPayConfiguration.appRSAPrivateKey(AliPayConfiguration.java:86)
at org.springframework.boot.context.properties.PropertyMapper$Source.lambda$as$2(PropertyMapper.java:220)
at org.springframework.boot.context.properties.PropertyMapper$Source.to(PropertyMapper.java:314)
at cn.felord.payment.alipay.AliPayConfiguration.alipayClient(AliPayConfiguration.java:56)
at cn.felord.payment.alipay.AliPayConfiguration$$EnhancerBySpringCGLIB$$c80d4b48.CGLIB$alipayClient$0()
at cn.felord.payment.alipay.AliPayConfiguration$$EnhancerBySpringCGLIB$$c80d4b48$$FastClassBySpringCGLIB$$3a7ecb2d.invoke()
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)

企业付款到零钱报错: No appropriate protocol (protocol is disabled or cipher suites are inappropriate);

openjdk version "11.0.12" 2021-07-20 LTS
OpenJDK Runtime Environment Zulu11.50+19-CA (build 11.0.12+7-LTS)
OpenJDK 64-Bit Server VM Zulu11.50+19-CA (build 11.0.12+7-LTS, mixed mode)

payment-spring-boot版本:1.0.11.RELEASE
感觉是TLS协议问题

org.springframework.web.client.ResourceAccessException: I/O error on POST request for "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers": No appropriate protocol (protocol is disabled or cipher suites are inappropriate); nested exception is javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:751) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:677) at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:586) at cn.felord.payment.wechat.v2.model.BaseModel.request(BaseModel.java:188) at cn.felord.payment.wechat.v2.WechatV2Client.wechatPayRequest(WechatV2Client.java:45) at cn.felord.payment.wechat.v2.WechatPayTransfersApi.transfer(WechatPayTransfersApi.java:56) at com.spluspartners.truehan.common.payment.service.TruehanThappPaymentService.transfers(TruehanThappPaymentService.java:60) at com.spluspartners.truehan.thapp.payment.service.impl.AppWalletServiceImpl.withdraw(AppWalletServiceImpl.java:145) at com.spluspartners.truehan.thapp.payment.service.impl.AppWalletServiceImpl$$FastClassBySpringCGLIB$$58cbfe5d.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:769) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689) at com.spluspartners.truehan.thapp.payment.service.impl.AppWalletServiceImpl$$EnhancerBySpringCGLIB$$587a37f2.withdraw(<generated>) at com.spluspartners.truehan.thapp.payment.controller.AppWalletController.withdraw(AppWalletController.java:116) at com.spluspartners.truehan.thapp.payment.controller.AppWalletController$$FastClassBySpringCGLIB$$e3e9b1d7.invoke(<generated>)

Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate) at java.base/sun.security.ssl.HandshakeContext.<init>(Unknown Source) at java.base/sun.security.ssl.ClientHandshakeContext.<init>(Unknown Source) at java.base/sun.security.ssl.TransportContext.kickstart(Unknown Source) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:436) at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:384) at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:374) at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186) at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89) at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) at org.springframework.http.client.HttpComponentsClientHttpRequest.executeInternal(HttpComponentsClientHttpRequest.java:87) at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:742) ... 119 common frames omitted

Caused by: cn.felord.payment.PayException: java.security.InvalidAlgorithmParameterException: unknown parameter type.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'signatureProvider' defined in class path resource [cn/felord/payment/wechat/WechatPayConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [cn.felord.payment.wechat.v3.SignatureProvider]: Factory method 'signatureProvider' threw exception; nested exception is cn.felord.payment.PayException: java.security.InvalidAlgorithmParameterException: unknown parameter type.
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:657)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:637)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1341)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1181)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:556)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:897)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:755)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:402)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:123)
at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190)
at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:244)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:43)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:82)
at org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:73)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248)
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211)
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:141)
at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:89)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [cn.felord.payment.wechat.v3.SignatureProvider]: Factory method 'signatureProvider' threw exception; nested exception is cn.felord.payment.PayException: java.security.InvalidAlgorithmParameterException: unknown parameter type.
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:652)
... 65 common frames omitted
Caused by: cn.felord.payment.PayException: java.security.InvalidAlgorithmParameterException: unknown parameter type.
at cn.felord.payment.wechat.v3.SignatureProvider.decryptResponseBody(SignatureProvider.java:292)
at cn.felord.payment.wechat.v3.SignatureProvider.lambda$3(SignatureProvider.java:237)
at java.lang.Iterable.forEach(Iterable.java:75)
at cn.felord.payment.wechat.v3.SignatureProvider.refreshCertificate(SignatureProvider.java:232)
at java.lang.Iterable.forEach(Iterable.java:75)
at cn.felord.payment.wechat.v3.SignatureProvider.(SignatureProvider.java:121)
at cn.felord.payment.wechat.WechatPayConfiguration.signatureProvider(WechatPayConfiguration.java:79)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
... 66 common frames omitted
Caused by: java.security.InvalidAlgorithmParameterException: unknown parameter type.
at org.bouncycastle.jce.provider.JCEBlockCipher.engineInit(Unknown Source)
at javax.crypto.Cipher.init(Cipher.java:1393)
at javax.crypto.Cipher.init(Cipher.java:1326)
at cn.felord.payment.wechat.v3.SignatureProvider.decryptResponseBody(SignatureProvider.java:281)
... 77 common frames omitted

退款回调报错com.fasterxml.jackson.databind.exc.InvalidDefinitionException

具体信息如下:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of java.time.OffsetDateTime (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('2021-03-10T09:27:19+08:00')
at [Source: (String)"{"mchid":"","out_trade_no":"","transaction_id":"","out_refund_no":"","refund_id":"**","refund_status":"SUCCESS","success_time":"2021-03-10T09:27:19+08:00","amount":{"total":1,"refund":1,"payer_total":1,"payer_refund":1},"user_received_account":"支付用户零钱"}"; line: 1, column: 257] (through reference chain: cn.felord.payment.wechat.v3.model.RefundConsumeData["success_time"])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1453)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1029)
at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:371)
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:323)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1373)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:171)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:161)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4086)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3106)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3076)
at cn.felord.payment.wechat.v3.WechatPayCallback.refundCallback(WechatPayCallback.java:293)

支付分支付成功回调反序列化异常

image
反序列化类缺少state_description字段,导致抛出com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException异常,需在n.felord.payment.wechat.v3.model.payscore.PayScoreUserPaidConsumeData中增加stateDescription成员变量,并为cn.felord.payment.wechat.v3.WechatPayCallback类中jackson实例配置MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);防止推送数据无对应成员变量造成解析异常

微信付款到零钱

提示错误:No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

WechatDirectPayApi 应返回具体POJO对象

版本

1.0.11

问题

目前的支付接口(例如WechatDirectPayApi#jsPay)返回的一律是ObjectNode,应当返回具体的POJO类,返回ObjectNode无法得知都有哪些属性字段。

例如:

public WechatResponseEntity<JsPayResult> jsPay(PayParams payParams) {
    ... ...
}

微信支付退款接口非必填参数未赋值抛异常

根据微信官方退款接口文档
notify_url和funds_account为非必填参数

但是在调用cn.felord.payment.wechat.v3.WechatDirectPayApi#refund接口时
cn.felord.payment.wechat.v3.model.RefundParams
notify_url未赋值会抛NPE异常,
funds_account未填会预设一个非"AVALIABLE"的值,导致与预期不符
建议参数是否必填同步一下官网文档,或者在代码处标注一下参数是否必填

failed to load wechat pay cert

2021-07-01 15:08:10.910 ERROR 1 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'orderController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'wechatApiProvider' defined in class path resource [cn/felord/payment/wechat/WechatPayConfiguration.class]: Unsatisfied dependency expressed through method 'wechatApiProvider' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'wechatPayClient' defined in class path resource [cn/felord/payment/wechat/WechatPayConfiguration.class]: Unsatisfied dependency expressed through method 'wechatPayClient' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'signatureProvider' defined in class path resource [cn/felord/payment/wechat/WechatPayConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [cn.felord.payment.wechat.v3.SignatureProvider]: Factory method 'signatureProvider' threw exception; nested exception is org.springframework.web.client.HttpClientErrorException$Unauthorized: 401 Unauthorized: [{"code":"SIGN_ERROR","message":"Http?Authorization??timestamp????????????5??"}]
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:321) ~[spring-context-5.2.15.RELEASE.jar:5.2.15.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1425) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:897) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879) ~[spring-context-5.2.15.RELEASE.jar:5.2.15.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551) ~[spring-context-5.2.15.RELEASE.jar:5.2.15.RELEASE]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) ~[spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:755) ~[spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:402) ~[spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) ~[spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1247) ~[spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1236) ~[spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE]
	at com.siwuen.tuwen.TuWenApplication.main(TuWenApplication.java:15) ~[classes!/:0.0.1-SNAPSHOT]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
	at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[TuWen-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) ~[TuWen-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) ~[TuWen-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
	at org.springframework.boot.loader.PropertiesLauncher.main(PropertiesLauncher.java:467) ~[TuWen-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]

接入payment后启动项目报错,错误为:javax.crypto.AEADBadTagException: mac check in GCM failed错误

Caused by: javax.crypto.AEADBadTagException: mac check in GCM failed
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
具体代码行在v3.SignatureProvider.decryptResponseBody(SignatureProvider.java:273)

本地环境运行正常,上线服务器后报错unknown parameter type,cipher.init出现问题?

Caused by: cn.felord.payment.PayException: java.security.InvalidAlgorithmParameterException: unknown parameter type.
at cn.felord.payment.wechat.v3.SignatureProvider.decryptResponseBody(SignatureProvider.java:281)
at cn.felord.payment.wechat.v3.SignatureProvider.lambda$refreshCertificate$0(SignatureProvider.java:230)
at java.lang.Iterable.forEach(Iterable.java:75)
at cn.felord.payment.wechat.v3.SignatureProvider.refreshCertificate(SignatureProvider.java:225)
at java.lang.Iterable.forEach(Iterable.java:75)
at cn.felord.payment.wechat.v3.SignatureProvider.(SignatureProvider.java:114)
at cn.felord.payment.wechat.WechatPayConfiguration.signatureProvider(WechatPayConfiguration.java:79)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
... 102 more
Caused by: java.security.InvalidAlgorithmParameterException: unknown parameter type.
at org.bouncycastle.jce.provider.JCEBlockCipher.engineInit(Unknown Source)
at javax.crypto.Cipher.init(Cipher.java:1397)
at javax.crypto.Cipher.init(Cipher.java:1330)
at cn.felord.payment.wechat.v3.SignatureProvider.decryptResponseBody(SignatureProvider.java:270)
... 113 more

遇到【用于微信支付处理上传的自定义消息转换器ExtensionFormHttpMessageConverter】问题

引入
<dependency> <groupId>cn.felord</groupId> <artifactId>payment-spring-boot-starter</artifactId> <version>1.0.12.RELEASE</version> </dependency>
后,项目所有接口req请求的resp的ContentType变成了xml,调试发现:
ExtensionFormHttpMessageConverter里会把json转xml的转换器加入到SpringMVC中,导致controller所有@responsebody的接口,都返回了xml格式。

临时解决办法,排除包:
<dependency> <groupId>cn.felord</groupId> <artifactId>payment-spring-boot-starter</artifactId> <exclusions> <exclusion> <artifactId>jackson-dataformat-xml</artifactId> <groupId>com.fasterxml.jackson.dataformat</groupId> </exclusion> </exclusions> </dependency>

引入自己的项目后启动项目报错Unsatisfied dependency expressed through field 'wechatApiProvider'

jdk1.8
felord版本1.0.11.RELEASE

详细日志:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'applicationAvailability' defined in class path resource [org/springframework/boot/autoconfigure/availability/ApplicationAvailabilityAutoConfiguration.class]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'metaDataSourceAdvisor': Cannot resolve reference to bean 'methodSecurityMetadataSource' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration': Initialization of bean failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' available
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:512)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
at org.springframework.context.event.AbstractApplicationEventMulticaster.retrieveApplicationListeners(AbstractApplicationEventMulticaster.java:245)
at org.springframework.context.event.AbstractApplicationEventMulticaster.getApplicationListeners(AbstractApplicationEventMulticaster.java:197)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:134)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:403)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:360)
at org.springframework.boot.availability.AvailabilityChangeEvent.publish(AvailabilityChangeEvent.java:81)
at org.springframework.boot.availability.AvailabilityChangeEvent.publish(AvailabilityChangeEvent.java:67)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.doClose(ServletWebServerApplicationContext.java:167)
at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:978)
at org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:814)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:325)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
at com.zfnc.mall.portal.MallPortalApplication.main(MallPortalApplication.java:18)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'metaDataSourceAdvisor': Cannot resolve reference to bean 'methodSecurityMetadataSource' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration': Initialization of bean failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' available
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:342)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:113)
at org.springframework.beans.factory.support.ConstructorResolver.resolvePreparedArguments(ConstructorResolver.java:835)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:151)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1358)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1193)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
at org.springframework.aop.framework.autoproxy.BeanFactoryAdvisorRetrievalHelper.findAdvisorBeans(BeanFactoryAdvisorRetrievalHelper.java:91)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors(AbstractAdvisorAutoProxyCreator.java:109)
at org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors(AnnotationAwareAspectJAutoProxyCreator.java:92)
at org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.shouldSkip(AspectJAwareAdvisorAutoProxyCreator.java:101)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(AbstractAutoProxyCreator.java:251)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:1141)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:1114)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:506)
... 18 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration': Initialization of bean failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' available
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:603)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:409)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:330)
... 37 common frames omitted
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' available
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:814)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1282)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:297)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
at org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor.postProcessBeforeInitialization(ConfigurationClassPostProcessor.java:456)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:416)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1788)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595)
... 52 common frames omitted

v3退款几个问题

问题一:退款结果回调url跟付款的格式不一样要全部url,付款只要domain后面的路径就ok。
问题二:退款回调接口refundCallback方法eventType判断之前:
if (!Objects.equals(eventType, EventType.REFUND_CLOSED.event)|| !Objects.equals(eventType,EventType.REFUND_ABNORMAL.event)|| !Objects.equals(eventType,EventType.REFUND_SUCCESS.event)) { log.error("wechat pay event type is not matched, callbackParams {}", callbackParams); throw new PayException(" wechat pay event type is not matched"); }
然后回调接口一直报错后来改成如下:
if (!(Objects.equals(eventType, EventType.REFUND_CLOSED.event)|| Objects.equals(eventType,EventType.REFUND_ABNORMAL.event)|| Objects.equals(eventType,EventType.REFUND_SUCCESS.event))) { log.error("wechat pay event type is not matched, callbackParams {}", callbackParams); throw new PayException(" wechat pay event type is not matched"); }
这样就OK了。
问题三:回调接口返回值转换出错:
RefundConsumeData consumeData = MAPPER.readValue(data, RefundConsumeData.class);
debug以后发现:
RefundConsumeData这个类里的RefundStatus枚举是空的,改动如下:

public enum RefundStatus {
/**
* 退款成功事件.
*
* @SInCE 1.0.6.RELEASE
*/
SUCCESS("REFUND.SUCCESS"),

/**
 * 退款异常事件.
 *
 * @since 1.0.6.RELEASE
 */
ABNORMAL("REFUND.ABNORMAL"),

/**
 * 退款关闭事件.
 *
 * @since 1.0.6.RELEASE
 */
CLOSED("REFUND.CLOSED"),
/**
 * 支付成功事件.
 *
 * @since 1.0.0.RELEASE
 */
TRANSACTION("TRANSACTION.SUCCESS");
/**
 * The Event.
 */
private final String refundStatus;

/**
 * Instantiates a new Event type.
 *
 * @param refundStatus the event
 */
RefundStatus(String refundStatus) {
    this.refundStatus = refundStatus;
}

}

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.