Ejemplo n.º 1
0
        public async Task <(bool, GetH5PaymentBeforeResponseDto)> GetH5PaymentBeforeAsync(GetH5PaymentBeforeResquestDto requstDto)
        {
            //微信下单

            //随机字符串参数
            string nonceStr = WeChatUtils.GetRandomString(16, false, true, true, false, string.Empty);
            var    unifiedOrderRequestDto = new UnifiedOrderRequestDto
            {
                AppId          = PlatformSettings.CDClientAppId,
                MerchantId     = requstDto.MerchantId,
                Body           = requstDto.Body,
                OutTradeNo     = requstDto.OutTradeNo,
                TotalFee       = requstDto.TotalFee,  //支付金额,单位分
                NotifyUrl      = requstDto.NotifyUrl, //支付通知回调
                OpenId         = requstDto.OpenId,
                MerchantSecret = requstDto.MerchantSecret,
                NonceStr       = nonceStr
            };
            var unifiedRes = await UnifiedOrderAsync(unifiedOrderRequestDto);

            if (!unifiedRes.IsReturnCodeSuccess() || !unifiedRes.IsResultCodeSuccess())
            {
                var errMsg = new StringBuilder();
                errMsg.Append($"微信支付下单失败:return_msg-{unifiedRes.return_msg}|err_code-{unifiedRes.err_code}|err_code_des-{unifiedRes.err_code_des}");
                errMsg.Append($"{Environment.NewLine}at SenparcPayBiz.GetH5PaymentBeforeAsync({JsonConvert.SerializeObject(requstDto)})");
                Logger.Error(errMsg.ToString());
                return(false, null);
            }
            var result = new GetH5PaymentBeforeResponseDto
            {
                AppId     = unifiedOrderRequestDto.AppId,
                TimeStamp = WeChatUtils.GetTimestamp(),
                NonceStr  = unifiedOrderRequestDto.NonceStr,
                Package   = $"prepay_id={unifiedRes.prepay_id}",
                SignType  = "MD5"
            };

            result.Sign = TenPayV3.GetJsPaySign(
                unifiedOrderRequestDto.AppId,
                result.TimeStamp, result.NonceStr,
                result.Package,
                unifiedOrderRequestDto.MerchantSecret,
                "MD5");
            return(true, result);
        }
        /// <summary>
        /// 获取JS-SDK权限验证的签名Signature
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="appSecret"></param>
        /// <param name="url">当前网页的URL,不包含#及其后面部分</param>
        /// <returns></returns>
        public static async Task <WeChatJsSDKSignatureResponse> GetSignatureAsync(string appId, string appSecret, string url)
        {
            var ticketResponse = await WeChartApi.GetJsAPITicket(appId, appSecret);

            string    ticket    = ticketResponse.Ticket;
            string    noncestr  = WeChatUtils.GetNoncestr();
            string    timestamp = WeChatUtils.GetTimestamp();
            Hashtable val       = new Hashtable();

            val.Add("jsapi_ticket", ticket);
            val.Add("noncestr", noncestr);
            val.Add("timestamp", timestamp);
            val.Add("url", url);
            return(new WeChatJsSDKSignatureResponse
            {
                AppId = appId,
                NonceStr = noncestr,
                Timestamp = timestamp,
                Signature = CreateSha1(val)
            });
        }
        public static BaseWeChatXmlMsg CreateMessage(string xml)
        {
            if (_queue == null)
            {
                _queue = new List <BaseWeChatXmlMsg>();
            }
            else if (_queue.Count >= 50)
            {
                _queue = _queue.Where(q => { return(q.CreatedTime.AddSeconds(20) > DateTime.Now); }).ToList();//保留20秒内未响应的消息
            }
            XElement       xdoc         = XElement.Parse(xml);
            var            msgtype      = xdoc.Element("MsgType").Value.ToUpper();
            var            FromUserName = xdoc.Element("FromUserName").Value;
            var            CreateTime   = xdoc.Element("CreateTime").Value;
            WeChartMsgType type         = (WeChartMsgType)Enum.Parse(typeof(WeChartMsgType), msgtype);

            if (type != WeChartMsgType.EVENT)
            {
                var MsgId = xdoc.Element("MsgId").Value;
                if (_queue.FirstOrDefault(m => { return(m.MsgFlag == MsgId); }) == null)
                {
                    _queue.Add(new BaseWeChatXmlMsg
                    {
                        CreatedTime  = DateTime.Now,
                        FromUserName = FromUserName,
                        MsgFlag      = MsgId
                    });
                }
                else
                {
                    return(null);
                }
            }
            else
            {
                if (_queue.FirstOrDefault(m => { return(m.MsgFlag == CreateTime && m.FromUserName == FromUserName); }) == null)
                {
                    _queue.Add(new BaseWeChatXmlMsg
                    {
                        CreatedTime  = DateTime.Now,
                        FromUserName = FromUserName,
                        MsgFlag      = CreateTime
                    });
                }
                else
                {
                    return(null);
                }
            }
            switch (type)
            {
            case WeChartMsgType.TEXT:
                return(WeChatUtils.ConvertXmlToObj <WeChatXmlTextMsg>(xml));

            case WeChartMsgType.IMAGE:
                return(WeChatUtils.ConvertXmlToObj <BaseWeChatXmlMsg>(xml));

            case WeChartMsgType.VOICE:
                return(WeChatUtils.ConvertXmlToObj <BaseWeChatXmlMsg>(xml));

            case WeChartMsgType.VIDEO:
                return(WeChatUtils.ConvertXmlToObj <BaseWeChatXmlMsg>(xml));

            case WeChartMsgType.LOCATION:
                return(WeChatUtils.ConvertXmlToObj <BaseWeChatXmlMsg>(xml));

            case WeChartMsgType.LINK:
                return(WeChatUtils.ConvertXmlToObj <BaseWeChatXmlMsg>(xml));

            case WeChartMsgType.EVENT:
                var enumEventType = (WeChartEvent)Enum.Parse(typeof(WeChartEvent), xdoc.Element("Event").Value.ToUpper());
                switch (enumEventType)
                {
                case WeChartEvent.CLICK:
                    return(WeChatUtils.ConvertXmlToObj <WeChatXmlNormalMenuEventMsg>(xml));

                case WeChartEvent.VIEW: return(WeChatUtils.ConvertXmlToObj <WeChatXmlNormalMenuEventMsg>(xml));

                case WeChartEvent.LOCATION: return(WeChatUtils.ConvertXmlToObj <BaseWeChatEventXmlMsg>(xml));

                case WeChartEvent.LOCATION_SELECT: return(WeChatUtils.ConvertXmlToObj <BaseWeChatEventXmlMsg>(xml));

                case WeChartEvent.SCAN: return(WeChatUtils.ConvertXmlToObj <WeChatScanEventMessage>(xml));

                case WeChartEvent.SUBSCRIBE: return(WeChatUtils.ConvertXmlToObj <WeChatSubEventXmlMsg>(xml));

                case WeChartEvent.UNSUBSCRIBE: return(WeChatUtils.ConvertXmlToObj <BaseWeChatEventXmlMsg>(xml));

                case WeChartEvent.SCANCODE_WAITMSG: return(WeChatUtils.ConvertXmlToObj <BaseWeChatEventXmlMsg>(xml));

                default:
                    return(WeChatUtils.ConvertXmlToObj <BaseWeChatEventXmlMsg>(xml));
                }

            default:
                return(WeChatUtils.ConvertXmlToObj <BaseWeChatXmlMsg>(xml));
            }
        }