/// <summary> /// 检查 /// </summary> /// <param name="info"></param> /// <returns></returns> public override bool Check(PaylineEntity info) { if (string.IsNullOrEmpty(info.OutNumber) || info.Status != PaylineStatusType.Waiting || string.IsNullOrEmpty(info.Number)) { return(false); } var result = GetPayResult(info.Number); if (result == null || !result.ContainsKey("trade_state")) { return(false); } if (result["trade_state"] == "USERPAYING") { return(false); } if (result["trade_state"] == "SUCCESS") { info.Status = PaylineStatusType.Success; } else { info.Status = PaylineStatusType.Failure; } info.OutNumber = result.ContainsKey("transaction_id") ? result["transaction_id"] : ""; info.SaveType = SaveType.Modify; info.SetProperty(it => it.Status); info.SetProperty(it => it.OutNumber); return(true); }
/// <summary> /// 手机支付 /// </summary> /// <param name="info"></param> /// <returns></returns> protected virtual bool CreateByWap(PaylineEntity info) { var builder = new StringBuilder("{"); builder.AppendFormat("\"body\":\"{0}\",", info.TypeName); builder.AppendFormat("\"subject\":\"{0}\",", info.TypeName); builder.AppendFormat("\"out_trade_no\":\"{0}\",", info.Number); builder.AppendFormat("\"total_amount\":\"{0}\",", info.Amount != 0 || info.PaylineItems == null ? info.Amount : info.PaylineItems.Sum(it => it.Amount)); builder.AppendFormat("\"product_code\":\"{0}\",", "QUICK_WAP_PAY");//FAST_INSTANT_TRADE_PAY builder.Append("}"); AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest(); request.BizContent = builder.ToString(); var processUrl = string.Format("{0}/AliPay/Process", ConfigurationManager.GetSetting <string>("DistributedOutsidePayUrl")); var returnUrl = string.Format("{0}?returnurl={1}&returntitle={2}&autoreturnurl={3}&autoreturntitle={4}" , processUrl, HttpContext.Current.Request["returnurl"] , HttpContext.Current.Request["returntitle"] , HttpContext.Current.Request["autoreturnurl"] , HttpContext.Current.Request["autoreturntitle"]); request.SetReturnUrl(returnUrl); request.SetNotifyUrl(processUrl); AlipayTradeWapPayResponse response = AopClient.pageExecute(request); info.Request = response.Body; return(true); }
/// <summary> /// PC 支付 /// </summary> /// <param name="info"></param> /// <returns></returns> protected virtual bool CreateByPage(PaylineEntity info) { var builder = new StringBuilder("{"); //订单描述,可空 builder.AppendFormat("\"body\":\"订单支付{0}\",", info.Number); //订单标题 builder.AppendFormat("\"subject\":\"订单支付{0}\",", info.Number); //商户订单号,64个字符以内、可包含字母、数字、下划线;需保证在商户端不重复 builder.AppendFormat("\"out_trade_no\":\"{0}\",", info.Number); //订单总金额 builder.AppendFormat("\"total_amount\":\"{0}\",", info.Amount != 0 || info.PaylineItems == null ? info.Amount : info.PaylineItems.Sum(it => it.Amount)); //销售产品码,与支付宝签约的产品码名称。 注:目前仅支持FAST_INSTANT_TRADE_PAY builder.AppendFormat("\"product_code\":\"{0}\"", "FAST_INSTANT_TRADE_PAY"); builder.Append("}"); AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); request.BizContent = builder.ToString(); var processUrl = string.Format("{0}/AliPay/Process", ConfigurationManager.GetSetting <string>("DistributedOutsidePayUrl")); request.SetReturnUrl(processUrl); request.SetNotifyUrl(processUrl); AlipayTradePagePayResponse response = AopClient.pageExecute(request); info.Request = response.Body; return(true); }
/// <summary> /// 退款 /// </summary> /// <param name="info"></param> /// <returns></returns> public override bool Refund(PaylineEntity info) { string url = "https://api.mch.weixin.qq.com/pay/orderquery"; var requsetParams = new SortedDictionary <string, string>(); requsetParams.Add("total_fee ", Math.Abs(info.Amount * 100).ToString()); requsetParams.Add("refund_fee ", Math.Abs(info.Amount * 100).ToString()); requsetParams.Add("out_refund_no ", info.Number); requsetParams.Add("transaction_id ", info.OutNumber); requsetParams.Add("appid", AppId); requsetParams.Add("mch_id", PartnerKey); requsetParams.Add("nonce_str", Guid.NewGuid().ToString().Replace("-", ""));//随机字符串 requsetParams.Add("sign", MakeSign(requsetParams, PaySignKey)); string xml = ToRequestXml(requsetParams); string response = WebRequestHelper.SendPostRequest(url, Encoding.UTF8, xml); var result = FromResponseXml(response); if (result == null || !result.ContainsKey("return_code") || result["return_code"] != "SUCCESS") { return(false); } info.Status = PaylineStatusType.Success; info.OutNumber = result.ContainsKey("refund_id") ? result["refund_id"] : ""; return(true); }
/// <summary> /// 得到输出结果 /// </summary> /// <param name="info"></param> /// <returns></returns> protected virtual string GetRequest(PaylineEntity info) { var url = string.Format("{0}/{1}Payline/Create", ConfigurationManager.GetSetting <string>("DistributedOutsidePayUrl"), info.Type); var requset = (HttpWebRequest)WebRequest.Create(url); var cookies = new CookieCollection(); foreach (Cookie cookie in HttpContext.Current.Request.Cookies) { cookies.Add(cookie); } requset.CookieContainer.Add(new Uri(ConfigurationManager.GetSetting <string>("Domain")), cookies); return(WebRequestHelper.SendPostRequest(requset, Encoding.UTF8, new Dictionary <string, string> { { "ChannelType", info.ChannelType.ToString() }, { "AccountId", info.Account == null ? "0" : info.Account.Id.ToString() }, { "Amount", info.Amount.ToString() }, { "OrderIds", info.PaylineItems == null ? "" : string.Join(",", info.PaylineItems.Where(it => it.Order != null).Select(it => it.Order.Id).ToArray()) } })); }
/// <summary> /// 预下单 /// </summary> /// <param name="info"></param> protected virtual SortedDictionary <string, string> CreateWechatOrder(PaylineEntity info) { try { string url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; var processUrl = string.Format("{0}/WechartPay/Process", ConfigurationManager.GetSetting <string>("DistributedOutsidePayUrl")); var amount = info.Amount != 0 || info.PaylineItems == null ? info.Amount : info.PaylineItems.Sum(it => it.Amount); var requsetParams = new SortedDictionary <string, string>(); requsetParams.Add("body", info.Number); requsetParams.Add("attach", info.Number); requsetParams.Add("out_trade_no", info.Number); requsetParams.Add("total_fee", (amount * 100).Convert <int>().ToString()); requsetParams.Add("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); requsetParams.Add("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); requsetParams.Add("trade_type", HttpContext.Current.Request["trade_type"]); requsetParams.Add("openid", info.Forms == null || !info.Forms.ContainsKey("openid") ? null: info.Forms["openid"]); requsetParams.Add("appid", AppId); requsetParams.Add("mch_id", PartnerKey); requsetParams.Add("spbill_create_ip", HttpContext.Current.Request.UserHostAddress); requsetParams.Add("nonce_str", Guid.NewGuid().ToString().Replace("-", "")); requsetParams.Add("notify_url", processUrl); requsetParams.Add("sign", MakeSign(requsetParams, PaySignKey).ToUpper()); string xml = ToRequestXml(requsetParams); string response = WebRequestHelper.SendPostRequest(url, Encoding.UTF8, xml); return(FromResponseXml(response)); } catch (Exception ex) { Winner.Creator.Get <Winner.Log.ILog>().AddException(ex); } return(null); }
/// <summary> /// 创建 /// </summary> /// <param name="info"></param> /// <returns></returns> public override bool Create(PaylineEntity info) { var resParams = CreateWechatOrder(info); if (resParams == null || !resParams.ContainsKey("appid") || !resParams.ContainsKey("prepay_id") || string.IsNullOrEmpty(resParams["appid"]) || string.IsNullOrEmpty(resParams["prepay_id"])) { return(false); } var paraTemp = new SortedDictionary <string, string> { { "appId", resParams["appid"] }, { "timeStamp", (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds.Convert <long>().ToString() }, { "nonceStr", Guid.NewGuid().ToString().Replace("-", "") }, { "package", string.Format("prepay_id={0}", resParams["prepay_id"]) }, { "signType", "MD5" } }; paraTemp.Add("paySign", MakeSign(paraTemp, PaySignKey)); info.Forms = paraTemp; info.OutNumber = resParams["prepay_id"]; info.Status = PaylineStatusType.Waiting; info.Request = GetRequest(info, resParams); return(true); }
/// <summary> /// 退款 /// </summary> /// <param name="info"></param> /// <returns></returns> public override bool Refund(PaylineEntity info) { var account = Creator.Get <IContext>().Get <AccountEntity>(info.Account.Id); if (account == null) { info.AddErrorByName(typeof(AccountEntity).FullName, "NoExist"); return(false); } info.AccountItem = new AccountItemEntity { Account = account, Amount = info.Amount, Data = info, Name = info.TypeName, Remark = info.Remark, SaveType = SaveType.Add, }; info.Forms = null; info.Request = ""; info.OutNumber = info.Number; info.Status = PaylineStatusType.Success; info.Response = ""; info.Amount = 0; return(true); }
/// <summary> /// 创建 /// </summary> /// <param name="info"></param> /// <returns></returns> public override bool Create(PaylineEntity info) { var resParams = CreateWechatOrder(info); if (resParams == null || !resParams.ContainsKey("appid") || !resParams.ContainsKey("prepay_id") || string.IsNullOrEmpty(resParams["appid"]) || string.IsNullOrEmpty(resParams["prepay_id"])) { return(false); } var paraTemp = new SortedDictionary <string, string> { { "appId", resParams["appid"] }, { "timeStamp", (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds.Convert <long>().ToString() }, { "nonceStr", Guid.NewGuid().ToString().Replace("-", "") }, { "package", string.Format("prepay_id={0}", resParams["prepay_id"]) }, { "signType", "MD5" } }; paraTemp.Add("paySign", MakeSign(paraTemp, MchKey)); info.Forms = paraTemp; info.OutNumber = resParams["prepay_id"]; info.Status = PaylineStatusType.Waiting; info.Request = GetRequest(info, resParams); LogHelper.AddEcho(new EchoEntity { Method = "Beeant.Repository.Services.Finance.WechatPaylineRepository.Create", Request = info.Request, Response = "", Remark = "", Url = HttpContext.Current.Request.Url.ToString(), Key = info.Number, SaveType = SaveType.Add }); return(true); }
/// <summary> /// 创建 /// </summary> /// <param name="info"></param> /// <returns></returns> public override bool Create(PaylineEntity info) { if (info == null || info.Account == null) { return(false); } var account = Creator.Get <IContext>().Get <AccountEntity>(info.Account.Id); if (account == null || account.Balance < info.Amount) { info.AddErrorByName(typeof(AccountEntity).FullName, "BalanceEnough"); return(false); } info.AccountItem = new AccountItemEntity { Account = account, Amount = 0 - info.Amount, Number = info.Number, Name = info.TypeName, Remark = info.Remark, SaveType = SaveType.Add, }; info.Forms = null; info.Request = ""; info.OutNumber = info.Number; info.Status = PaylineStatusType.Success; info.Amount = 0; return(true); }
public virtual void Order() { var payline = new PaylineEntity { Account = new AccountEntity { Id = 30310 }, ChannelType = ChannelType.Website, Type = PaylineType.Wechat, Status = PaylineStatusType.Create, OutNumber = "4008932001201706125466991385" }; payline.PaylineItems = new List <PaylineItemEntity> { { new PaylineItemEntity { Order = new OrderEntity { Id = 31317 }, Payline = payline, Amount = (decimal) - 0.01, SaveType = SaveType.Add } } }; payline.Amount = payline.PaylineItems.Sum(it => it.Amount); Ioc.Resolve <IPaylineApplicationService>("Beeant.Application.Services.Finance.IWechatPaylineApplicationService").Refund(payline); }
/// <summary> /// 填充明细 /// </summary> protected virtual void FillRefundPaylineItems(PaylineEntity payline, OrderPayEntity orderPay, PaylineModel model) { if (orderPay == null) { return; } if (orderPay.Order == null || orderPay.Amount <= 0) { return; } var ammount = model.Amount.HasValue ? model.Amount.Value : orderPay.Amount; if (ammount > orderPay.Amount) { ammount = orderPay.Amount; } var paylineItem = new PaylineItemEntity { Order = string.IsNullOrWhiteSpace(model.RefundOrderId) ? orderPay.Order : new OrderEntity { Id = model.RefundOrderId.Convert <long>() }, Payline = payline, Key = orderPay.Key, Amount = 0 - ammount, SaveType = SaveType.Add }; payline.PaylineItems.Add(paylineItem); payline.OutNumber = orderPay.Number; }
/// <summary> /// 创建 /// </summary> /// <param name="model"></param> /// <param name="paylineType"></param> /// <returns></returns> protected virtual PaylineEntity CreatePayline(PaylineModel model, PaylineType paylineType) { var info = new PaylineEntity { Account = new AccountEntity { Id = Identity.Id }, ChannelType = model.ChannelType, Status = PaylineStatusType.Create, Remark = "", Type = paylineType, SaveType = SaveType.Add, PaylineItems = new List <PaylineItemEntity>(), Forms = model.Forms ?? new Dictionary <string, string>() }; var orders = GetOrders(model); FillPaylineItems(info, orders); if (model.Amount.HasValue) { info.Amount = model.Amount.Value; } GetPaylineApp(paylineType).Create(info); return(info); }
/// <summary> /// 得到输出 /// </summary> /// <param name="info"></param> /// <param name="resParas"></param> /// <returns></returns> protected virtual string GetRequest(PaylineEntity info, IDictionary <string, string> resParas) { if (HttpContext.Current.Request["trade_type"] == "JSAPI") { return(GetJsApiRequest(info)); } return(GetNativeRequest(info, resParas)); }
/// <summary> /// 得到请求 /// </summary> /// <param name="info"></param> /// <param name="resParas"></param> /// <returns></returns> protected virtual string GetNativeRequest(PaylineEntity info, IDictionary <string, string> resParas) { var builder = new StringBuilder(); builder.Append("<script>"); builder.AppendFormat("window.location.href='{0}';", resParas["code_url"]); builder.Append("</script>"); return(builder.ToString()); }
public PaylineUnitofwork(PaylineEntity payline, IWcfService wcfService) { if (payline == null) { return; } Payline = payline; WcfService = wcfService; }
/// <summary> /// /// </summary> /// <param name="info"></param> /// <returns></returns> public virtual bool Check(PaylineEntity info) { if (info.Status == PaylineStatusType.Waiting) { info.Status = PaylineStatusType.Failure; info.SaveType = SaveType.Modify; info.SetProperty(it => it.Status); } return(true); }
/// <summary> /// 参加接口 /// </summary> /// <param name="info"></param> /// <returns></returns> public virtual bool Create(PaylineEntity info) { try { info.Request = GetRequest(info); } catch (Exception ex) { Winner.Creator.Get <Winner.Log.ILog>().AddException(ex); } return(true); }
/// <summary> /// 扫码支付 输出二维码 /// 生成直接支付url,支付url有效期为2小时 /// </summary> /// <param name="info"></param> /// <param name="resParas"></param> /// <returns></returns> protected virtual string GetNativeRequest(PaylineEntity info, IDictionary <string, string> resParas) { var builder = new StringBuilder(); builder.AppendFormat("{0}/WechatPay/Qr", ConfigurationManager.GetSetting <string>("DistributedOutsidePayUrl")); builder.AppendFormat("?url={0}", resParas.ContainsKey("code_url") ? resParas["code_url"] : ""); builder.AppendFormat("&returnurl={0}&returntitle={1}&autoreturnurl={2}&autoreturntitle={3}", HttpContext.Current.Request["returnurl"] , HttpContext.Current.Request["returntitle"] , HttpContext.Current.Request["autoreturnurl"] , HttpContext.Current.Request["autoreturntitle"]); return(builder.ToString()); }
/// <summary> /// 支付失败 /// </summary> /// <param name="info"></param> /// <returns></returns> protected virtual ActionResult PayError(PaylineEntity info) { var message = info?.Errors?.FirstOrDefault()?.Message; message = string.IsNullOrWhiteSpace(message) ? "支付失败" : message; if (!string.IsNullOrEmpty(Request["failhandle"])) { return(Content(string.Format("<script type=\"text/javascript\" >document.domain='{0}';{1}('{2}');</script>", ConfigurationManager.GetSetting <string>("Domain"), Request["failhandle"], message))); } var url = string.Format("{0}/Home/Index", HttpContext.Request.Browser.IsMobileDevice ? this.GetUrl("PresentationWebsiteOrderUrl") : this.GetUrl("PresentationMobileOrderUrl")); return(Content(string.Format("<script type=\"text/javascript\" >alert('{0}');window.location.href='{1}'</script>", message, url))); }
/// <summary> /// 处理 /// </summary> /// <param name="info"></param> /// <returns></returns> protected virtual ActionResult Process(PaylineEntity info) { if (info == null || info.Status != PaylineStatusType.Success) { return(PayError(info)); } var url = string.Format("{0}/Home/Index", info.ChannelType == ChannelType.Website ? this.GetUrl("PresentationWebsiteOrderUrl") : this.GetUrl("PresentationMobileOrderUrl")); if (!string.IsNullOrEmpty(Request["successhandle"])) { return(Content(string.Format("<script type=\"text/javascript\" >document.domain='{0}';{1}('{2}');</script>", ConfigurationManager.GetSetting <string>("Domain"), Request["success"], info.Id))); } return(new RedirectResult(url)); }
/// <summary> /// 支付 /// </summary> /// <param name="info"></param> protected virtual PaylineEntity Pay(PaylineEntity info) { if (info.SaveType == SaveType.None) { return(info); } var unitofworks = DomainService.Handle(info); if (unitofworks != null) { Commit(unitofworks); } return(info); }
/// <summary> /// 退款 /// </summary> /// <param name="info"></param> /// <returns></returns> public virtual bool Refund(PaylineEntity info) { if (info == null || info.PaylineItems == null || info.Amount == 0) { return(false); } info.SaveType = SaveType.Add; info.SetNumber(); if (!PaylineRepository.Refund(info)) { return(false); } Pay(info); return(true); }
/// <summary> /// 同步接口 /// </summary> /// <param name="info"></param> /// <returns></returns> public virtual bool Create(PaylineEntity info) { if (info == null) { return(false); } info.SaveType = SaveType.Add; info.SetNumber(); if (!PaylineRepository.Create(info)) { return(false); } Pay(info); return(true); }
/// <summary> /// 处理接口 /// </summary> /// <returns></returns> public virtual PaylineEntity Process() { var inputparas = GetResponse(); var info = new PaylineEntity { Number = HttpContext.Current.Request["Number"], OutNumber = HttpContext.Current.Request["OutNumber"], Status = VerifyProcess(inputparas) ? PaylineStatusType.Success : PaylineStatusType.Failure }; info.SetProperty(it => it.OutNumber); info.SetProperty(it => it.Status); info.SaveType = SaveType.Modify; return(info); }
public override bool Refund(PaylineEntity info) { var builder = new StringBuilder("{"); //订单支付时传入的商户订单号,不能和 trade_no同时为空。 builder.AppendFormat("\"out_trade_no\":\"{0}\",", info.Number); //支付宝交易号,和商户订单号不能同时为空 2017开头 builder.AppendFormat("\"trade_no\":\"{0}\",", info.OutNumber); //需要退款的金额,该金额不能大于订单金额,单位为元,支持两位小数 builder.AppendFormat("\"refund_amount\":\"{0}\",", 0 - info.Amount); // 退款的原因说明 builder.AppendFormat("\"refund_reason\":\"{0}\",", "测试退款"); // 标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。 builder.AppendFormat("\"out_request_no\":\"{0}\"", info.Number); ////商户的操作员编号 //builder.AppendFormat("\"operator_id\":\"{0}\"", "FAST_INSTANT_TRADE_PAY"); //// 商户的门店编号 //builder.AppendFormat("\"store_id\":\"{0}\"", "FAST_INSTANT_TRADE_PAY"); ////商户的终端编号 //builder.AppendFormat("\"terminal_id\":\"{0}\"", "FAST_INSTANT_TRADE_PAY"); builder.Append("}"); AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); request.BizContent = builder.ToString(); AlipayTradeRefundResponse response = AopClient.Execute(request); info.Request = response.Body; LogHelper.AddEcho(new EchoEntity { Method = "Beeant.Repository.Services.Finance.AliPaylineRepository.Refund", Request = request.BizContent, Response = response.Body, Remark = "", Url = HttpContext.Current.Request.Url.ToString(), Key = info.Number, SaveType = SaveType.Add }); if (response.Msg == "Success") { info.OutNumber = response.TradeNo; info.Status = PaylineStatusType.Success; return(true); } return(false); }
/// <summary> /// 填充明细 /// </summary> /// <param name="payline"></param> /// <param name="orders"></param> protected virtual void FillPaylineItems(PaylineEntity payline, IList <OrderEntity> orders) { if (orders == null) { return; } foreach (var order in orders) { var paylineItem = new PaylineItemEntity { Order = order, Payline = payline, Amount = order.PayAmount == 0 && order.Deposit > 0 ? order.Deposit: order.TotalPayAmount - order.PayAmount, SaveType = SaveType.Add }; payline.PaylineItems.Add(paylineItem); } }
/// <summary> /// 验证手机号码 /// </summary> /// <param name="info"></param> /// <returns></returns> protected virtual bool ValidateExist(PaylineEntity info) { if (info == null || info.Status == PaylineStatusType.Success || info.Status == PaylineStatusType.Failure) { return(false); } var query = new QueryInfo(); query.Query <AccountIdentityEntity>().Where(it => it.Id != info.Id && it.Number == info.Number); var dataInfo = GetEntities <PaylineEntity>(query)?.FirstOrDefault(); if (dataInfo == null || dataInfo.Status == PaylineStatusType.Success || dataInfo.Status == PaylineStatusType.Failure) { info.AddError("StatusAlreadyTrue"); return(false); } return(true); }
/// <summary> /// 创建 /// </summary> /// <param name="model"></param> /// <param name="paylineType"></param> /// <returns></returns> protected virtual PaylineEntity CreateRefund(PaylineModel model, PaylineType paylineType) { var info = new PaylineEntity { Account = new AccountEntity { Id = Identity.Id }, ChannelType = model.ChannelType, Status = PaylineStatusType.Create, Remark = "", Type = paylineType, SaveType = SaveType.Add, PaylineItems = new List <PaylineItemEntity>(), Forms = model.Forms ?? new Dictionary <string, string>() }; var orderPays = GetOrderPays(model); FillRefundPaylineItems(info, orderPays); info.Amount = info.PaylineItems.Sum(it => it.Amount); GetPaylineApp(paylineType).Refund(info); return(info); }
/// <summary> /// 得到请求 /// </summary> /// <param name="info"></param> /// <returns></returns> protected virtual string GetJsApiRequest(PaylineEntity info) { var builder = new StringBuilder(); var ticket = Guid.NewGuid().ToString().Replace("-", ""); Winner.Creator.Get <Winner.Cache.ICache>().Set(ticket, ticket, DateTime.Now.AddMinutes(5)); builder.Append("<script type=\"text/javascript\"> function onBridgeReady(){"); builder.AppendFormat("WeixinJSBridge.invoke('getBrandWCPayRequest',{0}", info.Forms.SerializeJson()); builder.Append(",function(res){"); builder.Append("if (res.err_msg == \"get_brand_wcpay_request:ok\") { "); builder.AppendFormat("window.location.href='{0}/WechatPay/Process?number={1}&ticket={2}';", ConfigurationManager.GetSetting <string>("DistributedOutsidePayUrl"), info.Number, ticket); builder.Append(" }})}"); builder.Append(" if (typeof WeixinJSBridge == \"undefined\")"); builder.Append(" {if (document.addEventListener) {"); builder.Append(" document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);}"); builder.Append( " else if (document.attachEvent) { document.attachEvent('WeixinJSBridgeReady', onBridgeReady);"); builder.Append(" document.attachEvent('onWeixinJSBridgeReady', onBridgeReady); } }"); builder.Append("else{ onBridgeReady();}</script> "); return(builder.ToString()); }