Exemple #1
0
        /// <summary>
        /// 尝试获取 HTTP 返回代码,并附带备注信息
        /// </summary>
        /// <param name="httpStatusCode"></param>
        /// <returns></returns>
        public static TenPayApiResultCode TryGetCode(HttpStatusCode httpStatusCode, string responseContent)
        {
            TenPayApiResultCode resultCode = null;

            if (CodesCollection.TryGetValue(((int)httpStatusCode).ToString(), out var result))
            {
                //只有一条符合的结果
                if (result.Length == 1)
                {
                    return(result[0] with {
                    });
Exemple #2
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);
            }
        }