コード例 #1
0
        /// <summary>
        /// 请求参数,获取结果
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="url"></param>
        /// <param name="data">如果为 GET 请求,此参数可为 null</param>
        /// <returns></returns>
        public async Task <T> RequestAsync <T>(string url, object data, int timeOut = Config.TIME_OUT, ApiRequestMethod requestMethod = ApiRequestMethod.POST, bool checkSign = true, Func <T> createDefaultInstance = null)
            where T : ReturnJsonBase/*, new()*/
        {
            T result = null;

            try
            {
                HttpResponseMessage responseMessage = await GetHttpResponseMessageAsync(url, data, timeOut, requestMethod);

                //获取响应结果
                string content = await responseMessage.Content.ReadAsStringAsync();//TODO:如果不正确也要返回详情

                //检查响应代码
                TenPayApiResultCode resutlCode = TenPayApiResultCode.TryGetCode(responseMessage.StatusCode, content);

                if (resutlCode.Success)
                {
                    //TODO:待测试
                    //验证微信签名
                    //result.Signed = VerifyTenpaySign(responseMessage.Headers, content);
                    var wechatpayTimestamp       = responseMessage.Headers.GetValues("Wechatpay-Timestamp").First();
                    var wechatpayNonce           = responseMessage.Headers.GetValues("Wechatpay-Nonce").First();
                    var wechatpaySignatureBase64 = responseMessage.Headers.GetValues("Wechatpay-Signature").First();//后续需要base64解码
                    var wechatpaySerial          = responseMessage.Headers.GetValues("Wechatpay-Serial").First();

                    result = content.GetObject <T>();

                    if (checkSign)
                    {
                        try
                        {
                            var pubKey = await TenPayV3InfoCollection.GetAPIv3PublicKeyAsync(this._tenpayV3Setting, wechatpaySerial);

                            result.VerifySignSuccess = TenPaySignHelper.VerifyTenpaySign(wechatpayTimestamp, wechatpayNonce, wechatpaySignatureBase64, content, pubKey);
                        }
                        catch (Exception ex)
                        {
                            throw new TenpayApiRequestException("RequestAsync 签名验证失败:" + ex.Message, ex);
                        }
                    }
                }
                else
                {
                    result = createDefaultInstance?.Invoke() ?? GetInstance <T>(true);
                    resutlCode.Additional = content;
                }
                //T result = resutlCode.Success ? (await responseMessage.Content.ReadAsStringAsync()).GetObject<T>() : new T();
                result.ResultCode = resutlCode;

                return(result);
            }
            catch (Exception ex)
            {
                SenparcTrace.BaseExceptionLog(ex);
                result = createDefaultInstance?.Invoke() ?? GetInstance <T>(false);
                if (result != null)
                {
                    result.ResultCode = new() { ErrorMessage = ex.Message };
                }

                return(result);
            }
        }
コード例 #2
0
ファイル: Register.cs プロジェクト: yueliuhun/WeiXinMPSDK
 /// <summary>
 /// 注册微信支付TenpayV3
 /// </summary>
 /// <param name="registerService">RegisterService</param>
 /// <param name="tenPayV3Info">微信支付(新版本 V3)参数</param>
 /// <param name="name">公众号唯一标识名称</param>
 /// <returns></returns>
 public static IRegisterService RegisterTenpayRealV3(this IRegisterService registerService, Func <TenPayV3Info> tenPayV3Info, string name)
 {
     TenPayV3InfoCollection.Register(tenPayV3Info(), name);
     return(registerService);
 }