dromara / payment-spring-boot Goto Github PK
View Code? Open in Web Editor NEW微信支付V3支付,支持微信优惠券,代金券、商家券、公众号支付、微信小程序支付、分账、支付分、商家券、合单支付、先享卡、电商收付通等全部微信支付功能API,同时满足服务商、商户开发需求。一键集成,上手快,欢迎star。
License: Apache License 2.0
微信支付V3支付,支持微信优惠券,代金券、商家券、公众号支付、微信小程序支付、分账、支付分、商家券、合单支付、先享卡、电商收付通等全部微信支付功能API,同时满足服务商、商户开发需求。一键集成,上手快,欢迎star。
License: Apache License 2.0
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:
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":"签名错误"}
现在是可以从classpath/jar包正常加载,但这种重要的证书文件,一般不会放到git上,就会导致打包编译的时候,产生各种问题。
希望可以通过配置 cert-path:file:///home/admin/pay/xxx.p12
这种方式能正常加载。
运行环境: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)
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
建议 WechatPayProperties.V3 类中添加一个 扩展字段,用于业务中多租户自定义使用
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
io exception
具体信息如下:
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)
https://api.mch.weixin.qq.com/v3/marketing/busifavor/stocks
你好这个接口没有开发吗,没有找到对应的方法
难道不支持其它的,有歧义。
反序列化类缺少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)
Caused by: cn.felord.payment.PayException: java.security.InvalidKeyException: Illegal key size
确定v3v2api密钥都填了,确定没有填错
请问,目前是不是没有根据支付单号来查询所有退款单?因为微信他设计是一笔支付可以退几次款
cn.felord.payment.wechat.v3.SignatureProvider 中SCHEMA的值后了个空格
private static final String SCHEMA = "WECHATPAY2-SHA256-RSA2048 ";
技术比较差,希望理解,第一次接触这种功能,谢谢!
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"的值,导致与预期不符
建议参数是否必填同步一下官网文档,或者在代码处标注一下参数是否必填
服务商模式下支付回调结果用户openid存放在:payer 下 sp_openid OR sub_openid,回调解析类 TransactionConsumeData 仅有 payer openid ,好像没有封装上
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]
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)
如题。支付成功了,但是一直没有收到回调通知。请问这个是怎么回事呢?回调api是根据你的示例写的。
读取证书默认是只能classpath下的,能不能读取绝对路径
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
把 商户 api 证书放好了,但是他又报这个错
引入
<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>
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
用户通过小程序支付订单时可能出于某种原因暂取消支付,然后在订单中心提取原订单(商户订单号不变)继续支付时提示“201 商户订单号重复”,请问如何解决
问题一:退款结果回调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;
}
}
水平比较差方便理解一下
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.