Giter VIP home page Giter VIP logo

abp.wechat's People

Contributors

as260405901 avatar gdlcf88 avatar raymmond avatar real-zony avatar seventh88 avatar slarkerino avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

abp.wechat's Issues

配置注册机制

微信回调时需要签名验证,而微信不会携带租户信息(实际上用户可能自定义甚至无关租户的mchid,比如EShop的多商户场景),因此需要做处理,考虑注册机制。

例如:注册表默认由内存提供,如果开发者想严格多租户或者用其他方式例如缓存和sql,他可以替换实现。在微信回调时从注册表匹配配置,方便签名验证。

关联:#3

微信支付配置如何多租户复用

是否支持在后台返回客户端需要的签名及相关参数呢,比如多租户情况下,一个后台支撑N个相同的小程序时,这样就不用每个小程序都配置

路由修正

image
补充:

  • 截图中只是部分方法,应根据此规律对其他方法全部检查
  • 截图中方式为Post的2个方法,是否应属于api,有待考虑

你把小程序appid等配置信息写进启动模块,那这个服务端怎么同时支持多个小程序?

以下是你的配置实例:
1.2 模块的配置
微信模块的配置参数都存放在 AbpWeChatMiniProgramOptions 内部,开发人员只需要在启动模块的 ConfigureService() 方法中进行配置即可,下面是最小启动配置。

[DependsOn(typeof(AbpWeChatMiniProgramHttpApiModule))]
public class XXXHttpApiModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure(op =>
{
// 微信小程序所配置的 Token 值。
op.Token = "0000000000";
// 微信小程序分配的 AppId。
op.AppId = "0000000000";
// 微信小程序的唯一密钥。
op.AppSecret = "0000000000";
});
}
}

小程序微信支付

在easyabp.eshop中,使用微信小程序支付成功,微信回调支付通知接口302,无其它任何日志信息

微信支付多商户相关设计讨论

  • 所有的商户(AppId)应有注册机制
  • 支付结果通知接口、退款通知接口,应在路由上传入AppId,从注册的商户配置中匹配,用于进行签名验证,验证不通过的请求将不会传交给handler

@GameBelial 你怎么看?

未能获取配置ApiKey值

我在appsetting.json文件中添加了支付相关配置,如下所示:
image
除了ApiKey以外的所有值都获取到了,在微信统一下单时提示签名失败,经查看是未获取到ApiKey的配置,请问这是什么原因呢?

The input data is not a complete block.

2023-04-17 16:14:44.518 +08:00 [INF] Request starting HTTP/1.1 POST https://test-youdian-api.gejinet.com/wechat-pay/notify text/xml 834
2023-04-17 16:14:44.519 +08:00 [INF] Executing endpoint 'EasyAbp.Abp.WeChat.Pay.Controller.WeChatPayController.NotifyAsync (EasyAbp.Abp.WeChat.Pay.HttpApi)'
2023-04-17 16:14:44.520 +08:00 [INF] Route matched with {area = "easyAbpAbpWeChat", controller = "WeChatPay", action = "Notify", page = ""}. Executing controller action with signature System.Threading.Tasks.Task1[Microsoft.AspNetCore.Mvc.ActionResult] NotifyAsync(System.String, System.String) on controller EasyAbp.Abp.WeChat.Pay.Controller.WeChatPayController (EasyAbp.Abp.WeChat.Pay.HttpApi). 2023-04-17 16:14:44.522 +08:00 [ERR] The input data is not a complete block. System.Security.Cryptography.CryptographicException: The input data is not a complete block. at System.Security.Cryptography.UniversalCryptoDecryptor.UncheckedTransformFinalBlock(ReadOnlySpan1 inputBuffer, Span1 outputBuffer) at System.Security.Cryptography.UniversalCryptoDecryptor.UncheckedTransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) at System.Security.Cryptography.UniversalCryptoTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) at System.Security.Cryptography.CryptoStream.ReadAsyncCore(Memory1 buffer, CancellationToken cancellationToken, Boolean useAsync)
at Volo.Abp.Security.Encryption.StringEncryptionService.Decrypt(String cipherText, String passPhrase, Byte[] salt)
at Volo.Abp.Settings.SettingEncryptionService.Decrypt(SettingDefinition settingDefinition, String encryptedValue)

提供 IAbpWeChatSharableCache 实现规范示例。

您好!
我的Abp vNext 框架项目中引用 EasyAbp.Abp.Wechat.Official v2.3.0。
Api version 7.0.1

我在*.Domain项目中引用 EasyAbp.Abp.Wechat.Official,在 *.Application 项目中新建了 实现 IAbpWeChatSharableCache 抽象类的中 GetOrNullAsync() 和 SetAsync() 方法。

这是我的代码。

public class EasyAbpWechatAccesstokenCache : IAbpWeChatSharableCache, ITransientDependency
    {

        public async Task<string> GetOrNullAsync(string key)
        {
            return "";
        }

        public async Task SetAsync(string key, string value, DistributedCacheEntryOptions options)
        {
            throw new Exception();
        }
    }

期望的结果:在获取微信的access_token时,优先调用 EasyAbpWechatAccesstokenCache.GetOrNullAsync() 而不是 DefaultAbpWeChatSharableCache.GetOrNullAsync()

请指导。

Abp.Wechat 2.0+ 注入服务报错

NetCore Version: 6.0.0
Abp Version: 6.0.0
EasyAbp.Abp.WeChat.MiniProgram Version: 2.1.0
EasyAbp.Abp.WeChat.OfficialVersion: 2.1.0

但在2.0以下版本,如 1.11.0 注入任何服务都没有问题。

namespace AuthServer.Domain;
public class MiniProgramDomainService : IDomainService
{
    /// <summary>
    /// [公众号] 微信用户登录服务
    /// </summary>
    protected readonly EasyAbp.Abp.WeChat.Official.Services.Login.LoginWeService _loginService;

    /// <summary>
    /// 构造函数注入服务
    /// </summary>
    /// <param name="login"></param>
    /// <param name="miniLogin"></param>
    public MiniProgramDomainService(
        EasyAbp.Abp.WeChat.Official.Services.Login.LoginWeService login)
    {
        _loginService = login;
    }
}

namespace AuthServer.Application;
public class LoginAppService : ApplicationService, ILoginAppService
{
    protected readonly MiniProgramDomainService _miniProgram;

public LoginAppService(MiniProgramDomainService  miniProgram)
{
_miniProgram = miniProgram;
}
}

当调用 LoginAppService 中任一接口时,都会报错。

OrdinaryMerchantPayService获取错误

开发环境:
Net Core:6.0
ABP: 5.1.4
EasyAbp.Abp.WeChat.Pay:1.9.0
EasyAbp.Abp.WeChat.Pay.HttpApi:1.9.0

我已根据文档在HttpAPiModule注入相关内容:
image
然后我想要在我的Service里面使用下单,我更具测试的方法获取但是失败了,提示信息如下
image

模块设计思路探讨

我认为有两种设计思路:

  1. 单独封装名为Zony.WeChat的.net core通用库,本仓库变更为EasyAbp.Abp.WeChat,实现一个Provider调用Zony.WeChat从而实现功能。(同样也可以使用盛派实现Provider)
  2. 在EasyAbp.Abp.WeChat一把梭,直接实现功能

@GameBelial @wakuflair 你们怎么看?

扩展微信服务方法异常

异常信息

An exception was thrown while activating EasyAbp.Abp.WeChat.Official.ApiRequests.DefaultWeChatOfficialApiRequester -> EasyAbp.Abp.WeChat.Common.Infrastructure.AccessToken.DefaultAccessTokenProvider -> Xzkj.Hhcx.Distribution.AbpWeChatSharableCacheImplementation.

我的源代码

using EasyAbp.Abp.WeChat.Official.Options;
using EasyAbp.Abp.WeChat.Official.Services;
using System.Net.Http;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Xzkj.Hhcx.Distribution.WechatOfficialExtensions.QrCode.Request;
using Xzkj.Hhcx.Distribution.WechatOfficialExtensions.QrCode.Response;

namespace Xzkj.Hhcx.Distribution.WechatOfficialExtensions.QrCode;

/// <summary>
/// 微信 QRCode 服务
/// </summary>
public class QrCodeService : OfficialAbpWeChatServiceBase
{
    /// <summary>
    /// 创建二维码
    /// </summary>
    const string CreateQrCodeApiUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?";

    public QrCodeService(AbpWeChatOfficialOptions options, IAbpLazyServiceProvider lazyServiceProvider) : base(options, lazyServiceProvider)
    {
    }

    /// <summary>
    /// 创建QrCode
    /// </summary>
    /// <param name="actionName"></param>
    /// <param name="id"></param>
    /// <param name="expireSeconds"></param>
    /// <returns></returns>
    public Task<CreateQrCodeResponse> CreateQrCodeAsync(EnumQrCodeCreateActionName actionName, int id, int expireSeconds = 60)
    {
        return ApiRequester.RequestAsync<CreateQrCodeResponse>(
                CreateQrCodeApiUrl,
                HttpMethod.Post,
                new CreateQrCodeSceneIdRequest(actionName, id, expireSeconds),
                Options
            );
    }

    /// <summary>
    /// 创建QrCode
    /// </summary>
    /// <param name="actionName"></param>
    /// <param name="str"></param>
    /// <param name="expireSeconds"></param>
    /// <returns></returns>
    public Task<CreateQrCodeResponse> CreateQrCodeAsync(EnumQrCodeCreateActionName actionName, string str, int expireSeconds = 60)
    {
        return ApiRequester.RequestAsync<CreateQrCodeResponse>(
                CreateQrCodeApiUrl,
                HttpMethod.Post,
                new CreateQrCodeSceneStrRequest(actionName, str, expireSeconds),
                Options
            );
    }
}

我的调用方式(略写)

readonly IAbpWeChatServiceFactory _wechatFactory
// ···
 var qrCodeService = await _wechatFactory.CreateAsync<QrCodeService>();
 var qrCoreCreate = await qrCodeService.CreateQrCodeAsync(actionName: EnumQrCodeCreateActionName.QR_LIMIT_STR_SCENE, "1," + dir.UserId.ToString());

微信支付统一下单失败,签名错误

我在appsetting.json中配置了微信支付信息,如下:
image
在发起统一下单时提示签名错误,调试后发现,配置mch_id能正常获取到配置值,而ApiKey不能获取配置值,值为空字符串

微信支付结果判断问题

Abp.WeChat/src/Pay/EasyAbp.Abp.WeChat.Pay/Services/WeChatPayServiceBase.cs

protected virtual Task RequestAndGetReturnValueAsync(
此处判断
if (result.SelectSingleNode("/xml/return_code")?.InnerText != "SUCCESS" ||
result.SelectSingleNode("/xml/return_msg")?.InnerText != "OK")
建议改为
if (result.SelectSingleNode("/xml/return_code")?.InnerText != "SUCCESS" ||
result.SelectSingleNode("/xml/result_code")?.InnerText != "SUCCESS")

因为部分api 的return_msg 为空
例如:企业付款api https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers

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.