- api代金券核销事件收不到通知问题?
微信官方: 您好,我司为微信服务商,现联调微信V3接口中代金券营销方面的接口【https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/marketing/convention/chapter3_1.shtml】 我们调用创建代金券批次API成功,返回批次号stock_id。而且发放代金券API也调用成功。我们使用商户测试核销,也能交易成功,且核销成功。 遇到的问题1:核销事件回调通知收不到微信返回的消息。 我们的处理流程: ①在我们微信服务商平台已开通了营销事件推送的功能; ②调用设置消息通知地址API【https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/marketing/convention/chapter3_12.shtml】 已经成功设置了回调的URL:【http://gateway.onein.cn/wxCashCoupon/apps/showcallback】 但无论如何测试,都收不到发券、核销的通知消息,确实耽误了我们业务开发,望协助处理,万分感谢! 在社区里经过搜索, 发现同样的问题, 微信官方给出的建议是 1.仅可以收到由商户自己创建的批次相关的通知 2.商户后台要开通营销事件推送能力 3.提交notify_url参数设置,必须为https协议 让我们检查。 我们检查的结果是: 1.我们通过服务商的商户号【1589511341 】创建批次,进行激活和发券。在可核销的商户【1552376121,该商户为我们服务商的子商户】上进行交易完成的核销,满足第一条; 2.商户后台开通营销事件推送能力,因为我们是服务商,所以我们是在服务商后台开通的营销事件推送能力,已经开通。 3.提交的notify_url为:https://gateway.onein.cn/wxCashCoupon/apps/showcallback,是https协议的。 并且支持httppost请求, 这个接口很简单, 就是把请求的body打印出来. 最让我们奇怪的是, 我们自有商户1270717701 创建的代金券(也将回调地址设置为https://gateway.onein.cn/wxCashCoupon/apps/showcallback), 在可核销的商户【1552376121,该商户为我们服务商的子商户】进行交易, 微信能推送核销通知过来. 麻烦官方给检查下我们提交的url是否可以正常访问,是不是满足官方的要求;我们服务商的营销事件推送功能是否真的已经开通;或者还有其他地方需要注意和检查的。 经过几天的测试和修改,我们始终收不到回调消息,开发已经停滞,业务已经受到影响。请官方协助解决,万分感谢!
2020-06-24 - 证书和回调报文解密, 解密报错
环境是 asp.net core 3.1 目前我们接入了微信的发送代金券, 我们给用户发送了很多的代金券, 现在希望能收到用户消费代金券的回执信息, 所以这次接入核销事件回调通知 消费完代金券后收到微信推送过来的报文信息是 { "id": "da6f347c-9160-56c8-9435-441919007f3a", "create_time": "2020-04-28T21:11:36+08:00", "resource_type": "encrypt-resource", "event_type": "COUPON.USE", "summary": "代金券核销通知", "resource": { "original_type": "coupon", "algorithm": "AEAD_AES_256_GCM", "ciphertext": "/////////这个还没有用到就报错了. 因此我就隐去了", "associated_data": "coupon", "nonce": "9xCooUyvImYw" } } 解密代码用的是腾讯官方的代码, 执行过程中报错了. 下面代码中写了注释的一行报错了 private static string ALGORITHM = "AES/GCM/NoPadding"; private static int TAG_LENGTH_BIT = 128; private static int NONCE_LENGTH_BYTE = 12; private static string AES_KEY = "Q9HBMJ2P0Z6N4F7V5DKUCAI8TSL3XE1YWGRO"; public static string AesGcmDecrypt(string associatedData, string nonce, string ciphertext) { GcmBlockCipher gcmBlockCipher = new GcmBlockCipher(new AesEngine()); AeadParameters aeadParameters = new AeadParameters( new KeyParameter(Encoding.UTF8.GetBytes(AES_KEY)), 128, Encoding.UTF8.GetBytes(nonce), Encoding.UTF8.GetBytes(associatedData)); gcmBlockCipher.Init(false, aeadParameters);//执行到这里就报错了, 见下面的错误信息 byte[] data = Convert.FromBase64String(ciphertext); byte[] plaintext = new byte[gcmBlockCipher.GetOutputSize(data.Length)]; int length = gcmBlockCipher.ProcessBytes(data, 0, data.Length, plaintext, 0); gcmBlockCipher.DoFinal(plaintext, length); return Encoding.UTF8.GetString(plaintext); } d堆栈信息 发生异常: CLR/System.ArgumentException “System.ArgumentException”类型的异常在 BouncyCastle.Crypto.dll 中发生,但未在用户代码中进行处理: 'Key length not 128/192/256 bits.' 在 Org.BouncyCastle.Crypto.Engines.AesEngine.GenerateWorkingKey(Byte[] key, Boolean forEncryption) 在 Org.BouncyCastle.Crypto.Engines.AesEngine.Init(Boolean forEncryption, ICipherParameters parameters) 在 Org.BouncyCastle.Crypto.Modes.GcmBlockCipher.Init(Boolean forEncryption, ICipherParameters parameters) 在 NSwagJson.WeiXinCashCouponApi.Utils.AesGcm.AesGcmDecrypt(String associatedData, String nonce, String ciphertext) 在 /Users/jianjl/code/nswagjson.weixincashcouponapi/NSwagJson.WeiXinCashCouponApi/Utils/AesGcm.cs 中: 第 32 行 在 NSwagJson.WeiXinCashCouponApi.Controllers.CallBackController.CallBack(CouponCallBackRequest body) 在 /Users/jianjl/code/nswagjson.weixincashcouponapi/NSwagJson.WeiXinCashCouponApi/Controllers/CallBackController.cs 中: 第 80 行 在 Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync() 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()
2020-04-28