public ActionResult TemplateTest(string sessionId, string formId) { var sessionBag = SessionContainer.GetSession(sessionId); var openId = sessionBag != null ? sessionBag.OpenId : "用户未正确登陆"; string title = null; decimal price = 100; string productName = null; string orderNumber = null; if (formId.StartsWith("prepay_id=")) { formId = formId.Replace("prepay_id=", ""); title = "这是来自小程序支付的模板消息"; var cacheStrategy = CacheStrategyFactory.GetObjectCacheStrategyInstance(); var unifiedorderRequestData = cacheStrategy.Get <TenPayV3UnifiedorderRequestData>($"WxOpenUnifiedorderRequestData-{openId}"); //获取订单请求信息缓存 var unifedorderResult = cacheStrategy.Get <UnifiedorderResult>($"WxOpenUnifiedorderResultData-{openId}"); //获取订单信息缓存 if (unifedorderResult != null && formId == unifedorderResult.prepay_id) { price = unifiedorderRequestData.TotalFee; productName = unifiedorderRequestData.Body + "/缓存获取 prepay_id 成功"; orderNumber = unifiedorderRequestData.OutTradeNo; } else { productName = "缓存获取 prepay_id 失败"; orderNumber = "1234567890"; } productName += " | 注意:这条消息是从小程序发起的!仅作为UI上支付成功的演示!不能确定支付真实成功! | prepay_id:" + unifedorderResult.prepay_id; } else { title = "在线购买(小程序Demo测试)"; productName = "商品名称-模板消息测试"; orderNumber = "9876543210"; } var data = new WxOpenTemplateMessage_PaySuccessNotice(title, DateTime.Now, productName, orderNumber, price, "400-031-8816", "https://sdk.senparc.weixin.com"); try { Senparc.Weixin.WxOpen.AdvancedAPIs .Template.TemplateApi .SendTemplateMessage( WxOpenAppId, openId, data.TemplateId, data, formId, "pages/index/index", "图书", "#fff00"); return(Json(new { success = true, msg = "发送成功,请返回消息列表中的【服务通知】查看模板消息。\r\n点击模板消息还可重新回到小程序内。" })); } catch (Exception ex) { return(Json(new { success = false, openId = openId, formId = formId, msg = ex.Message })); } }
public async Task <SessionBag> RunTemplateTestAsync(string wxOpenAppId, string sessionId, string formId) { var sessionBag = await SessionContainer.GetSessionAsync(sessionId); var openId = sessionBag != null ? sessionBag.OpenId : "用户未正确登陆"; string title = null; decimal price = 1;//单位:分,实际使用过程中,通过数据库获取订单并读取 string productName = null; string orderNumber = null; if (formId.StartsWith("prepay_id=")) { formId = formId.Replace("prepay_id=", ""); title = "这是来自小程序支付的模板消息(仅测试接收,数据不一定真实)"; //DPBMARK TenPay var cacheStrategy = CacheStrategyFactory.GetObjectCacheStrategyInstance(); var unifiedorderRequestData = await cacheStrategy.GetAsync <TenPayV3UnifiedorderRequestData>($"WxOpenUnifiedorderRequestData-{openId}"); //获取订单请求信息缓存 var unifedorderResult = await cacheStrategy.GetAsync <UnifiedorderResult>($"WxOpenUnifiedorderResultData-{openId}"); //获取订单信息缓存 if (unifedorderResult != null && formId == unifedorderResult.prepay_id) { price = unifiedorderRequestData.TotalFee; productName = unifiedorderRequestData.Body + "/缓存获取 prepay_id 成功"; orderNumber = unifiedorderRequestData.OutTradeNo; } else//DPBMARK_END { productName = "缓存获取 prepay_id 失败"; orderNumber = "1234567890"; } productName += " | 注意:这条消息是从小程序发起的!仅作为UI上支付成功的演示!不能确定支付真实成功! | prepay_id:"; productName += unifedorderResult.prepay_id;//DPBMARK TenPay DPBMARK_END } else { title = "在线购买(仅测试小程序接收模板消息,数据不一定真实)"; productName = "商品名称-模板消息测试"; orderNumber = "9876543210"; } var data = new WxOpenTemplateMessage_PaySuccessNotice(title, SystemTime.Now, productName, orderNumber, price, "400-031-8816", "https://sdk.senparc.weixin.com"); await Senparc.Weixin.WxOpen.AdvancedAPIs .Template.TemplateApi .SendTemplateMessageAsync( wxOpenAppId, openId, data.TemplateId, data, formId, "pages/index/index", "图书", "#fff00"); return(sessionBag); }
public ActionResult TemplateTest(string sessionId, string formId) { var sessionBag = SessionContainer.GetSession(sessionId); var openId = sessionBag != null ? sessionBag.OpenId : "用户未正确登陆"; var data = new WxOpenTemplateMessage_PaySuccessNotice( "在线购买(小程序Demo测试)", DateTime.Now, "图书众筹", "1234567890", 100, "400-9939-858", "http://sdk.senparc.weixin.com"); try { Senparc.Weixin.WxOpen.AdvancedAPIs .Template.TemplateApi .SendTemplateMessage( AppId, openId, data.TemplateId, data, formId, "pages/index/index", "图书", "#fff00"); return(Json(new { success = true, msg = "发送成功,请返回消息列表中的【服务通知】查看模板消息。\r\n点击模板消息还可重新回到小程序内。" })); } catch (Exception ex) { return(Json(new { success = false, openId = openId, formId = formId, msg = ex.Message })); } }
/// <summary> /// JS-SDK支付回调地址(在统一下单接口中设置notify_url) /// </summary> /// <returns></returns> public ActionResult PayNotifyUrl(bool isWxOpenPay = false)//注意:统一下单接口中不能带参数! { WeixinTrace.SendCustomLog("微信支付回调", "来源:" + (isWxOpenPay ? "微信支付" : "小程序支付")); try { ResponseHandler resHandler = new ResponseHandler(null); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); bool paySuccess = false; resHandler.SetKey(TenPayV3Info.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") { paySuccess = true;//正确的订单处理 //直到这里,才能认为交易真正成功了,可以进行数据库操作,但是别忘了返回规定格式的消息! } else { paySuccess = false;//错误的订单处理 } if (paySuccess) { /* 这里可以进行订单处理的逻辑 */ //发送支付成功的模板消息 try { string appId = Config.SenparcWeixinSetting.WeixinAppId;//与微信公众账号后台的AppId设置保持一致,区分大小写。 string openId = resHandler.GetParameter("openid"); if (isWxOpenPay) { //DPBMARK MiniProgram var cacheStrategy = CacheStrategyFactory.GetObjectCacheStrategyInstance(); var unifiedorderRequestData = cacheStrategy.Get <TenPayV3UnifiedorderRequestData>($"WxOpenUnifiedorderRequestData-{openId}"); //获取订单请求信息缓存 var unifedorderResult = cacheStrategy.Get <UnifiedorderResult>($"WxOpenUnifiedorderResultData-{openId}"); //获取订单信息缓存 if (unifedorderResult != null || !string.IsNullOrEmpty(unifedorderResult.prepay_id)) { Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息参数(小程序)", appId + " , " + openId); //小程序支付,发送小程序模板消息 var templateData = new WxOpenTemplateMessage_PaySuccessNotice( "在线购买(小程序支付)测试", SystemTime.Now, "小程序支付 | 注意:这条消息来自微信服务器异步回调,官方证明支付成功! | prepay_id:" + unifedorderResult.prepay_id, unifiedorderRequestData.OutTradeNo, unifiedorderRequestData.TotalFee, "400-031-8816", "https://weixin.senparc.com"); //微信官方已停用此接口 //Senparc.Weixin.WxOpen.AdvancedAPIs // .Template.TemplateApi // .SendTemplateMessage( // Config.SenparcWeixinSetting.WxOpenAppId, openId, templateData.TemplateId, templateData, unifedorderResult.prepay_id, "pages/index/index", "图书", "#fff00"); } else { Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息参数(小程序)", "prepayId未记录:" + appId + " , " + openId); } //DPBMARK_END } else { //微信公众号支付 var templateData = new WeixinTemplate_PaySuccess("https://weixin.senparc.com", "购买商品", "状态:" + return_code); Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息参数(公众号)", appId + " , " + openId); var result = AdvancedAPIs.TemplateApi.SendTemplateMessage(appId, openId, templateData); } } catch (Exception ex) { WeixinTrace.WeixinExceptionLog(new WeixinException("支付成功模板消息异常", ex)); //WeixinTrace.SendCustomLog("支付成功模板消息", ex.ToString()); } WeixinTrace.SendCustomLog("PayNotifyUrl回调", "支付成功"); } else { Senparc.Weixin.WeixinTrace.SendCustomLog("PayNotifyUrl回调", "支付失败"); } #region 记录日志 var logDir = ServerUtility.ContentRootMapPath(string.Format("~/App_Data/TenPayNotify/{0}", SystemTime.Now.ToString("yyyyMMdd"))); if (!Directory.Exists(logDir)) { Directory.CreateDirectory(logDir); } var logPath = Path.Combine(logDir, string.Format("{0}-{1}-{2}.txt", SystemTime.Now.ToString("yyyyMMdd"), SystemTime.Now.ToString("HHmmss"), Guid.NewGuid().ToString("n").Substring(0, 8))); using (var fileStream = System.IO.File.OpenWrite(logPath)) { var notifyXml = resHandler.ParseXML(); //fileStream.Write(Encoding.Default.GetBytes(res), 0, Encoding.Default.GetByteCount(res)); fileStream.Write(Encoding.Default.GetBytes(notifyXml), 0, Encoding.Default.GetByteCount(notifyXml)); fileStream.Close(); } #endregion string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); return(Content(xml, "text/xml")); } catch (Exception ex) { WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); throw; } }
IActionResult PayNotifyUrl_Ex(bool isWxOpenPay)//注意:统一下单接口中不能带参数! { WeixinTrace.SendCustomLog("微信支付回调", "来源:" + (isWxOpenPay ? "微信支付" : "小程序支付")); try { ResponseHandler resHandler = new ResponseHandler(null); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); bool paySuccess = false; resHandler.SetKey(TenPayV3Info.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") { string out_trade_no = resHandler.GetParameter("out_trade_no"); string openid = resHandler.GetParameter("openid"); string total_fee = resHandler.GetParameter("total_fee"); string transaction_id = resHandler.GetParameter("transaction_id"); string end_time = resHandler.GetParameter("time_end"); try { var order = _context.Order.FirstOrDefault(od => od.OrderID == out_trade_no); if (order != null) { if (order.OrderStatus == TradeState.NOTPAY || order.OrderStatus == TradeState.USERPAYING) { order.TransactionId = transaction_id; order.ActPay = decimal.Parse(total_fee); order.OrderStatus = TradeState.SUCCESS; order.PayType = "WeiXin"; order.OpenID = openid; if (DateTime.TryParseExact(end_time, "yyyyMMddHHmmss", null, System.Globalization.DateTimeStyles.None, out DateTime paydatetime_)) { order.PayDateTime = paydatetime_; } else { order.PayDateTime = DateTime.Now; } _context.Order.Update(order); _context.SaveChanges(); paySuccess = true;//正确的订单处理 } else { return_code = "SUCCESS"; return_msg = "订单已支付"; paySuccess = true; } } else { return_code = "FAIL"; return_msg = "订单不存在"; paySuccess = false; } } catch (Exception ex) { return_code = "FAIL"; return_msg = "服务器异常"; paySuccess = false; _logger.LogError(ex, "数据无法保存" + ex.Message); } } else { paySuccess = false;//错误的订单处理 } if (paySuccess) { /* 这里可以进行订单处理的逻辑 */ //发送支付成功的模板消息 try { string appId = Config.SenparcWeixinSetting.WeixinAppId;//与微信公众账号后台的AppId设置保持一致,区分大小写。 string openId = resHandler.GetParameter("openid"); if (isWxOpenPay) { var cacheStrategy = CacheStrategyFactory.GetObjectCacheStrategyInstance(); var unifiedorderRequestData = cacheStrategy.Get <TenPayV3UnifiedorderRequestData>($"WxOpenUnifiedorderRequestData-{openId}"); //获取订单请求信息缓存 var unifedorderResult = cacheStrategy.Get <UnifiedorderResult>($"WxOpenUnifiedorderResultData-{openId}"); //获取订单信息缓存 if (unifedorderResult != null || !string.IsNullOrEmpty(unifedorderResult.prepay_id)) { Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息参数(小程序)", appId + " , " + openId); //小程序支付,发送小程序模板消息 var templateData = new WxOpenTemplateMessage_PaySuccessNotice( "在线购买(小程序支付)测试", DateTime.Now, "小程序支付 | 注意:这条消息来自微信服务器异步回调,官方证明支付成功! | prepay_id:" + unifedorderResult.prepay_id, unifiedorderRequestData.OutTradeNo, unifiedorderRequestData.TotalFee, "400-031-8816", "https://weixin.senparc.com"); Senparc.Weixin.WxOpen.AdvancedAPIs .Template.TemplateApi .SendTemplateMessage( Config.SenparcWeixinSetting.WxOpenAppId, openId, templateData.TemplateId, templateData, unifedorderResult.prepay_id, "pages/index/index", "图书", "#fff00"); } else { Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息参数(小程序)", "prepayId未记录:" + appId + " , " + openId); } } else { //微信公众号支付 var templateData = new WeixinTemplate_PaySuccess("https://weixin.senparc.com", "购买商品", "状态:" + return_code); Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息参数(公众号)", appId + " , " + openId); var result = Senparc.Weixin.MP.AdvancedAPIs.TemplateApi.SendTemplateMessage(appId, openId, templateData); } } catch (Exception ex) { WeixinTrace.WeixinExceptionLog(new WeixinException("支付成功模板消息异常", ex)); //WeixinTrace.SendCustomLog("支付成功模板消息", ex.ToString()); } WeixinTrace.SendCustomLog("PayNotifyUrl回调", "支付成功"); } else { Senparc.Weixin.WeixinTrace.SendCustomLog("PayNotifyUrl回调", "支付失败"); } string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); return(Content(xml, "text/xml")); } catch (Exception ex) { WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); throw; } }