C# MVC 微信支付教程系列之扫码支付代码实例

2019-12-30 15:30:50丽君

c#,微信扫码支付,c#微信扫码支付,demo

然后打开config.cs,找到以下代码:

c#,微信扫码支付,c#微信扫码支付,demo

对了,你很聪明。微信的处理逻辑就是,等用户支付成功之后,他会给这个链接发送支付结果,默认是以前那个aspx的页面,现在我换成mvc,所以,我们得手动新建一个control了,命名为:ResultNotifyController,然后代码如下:


using LmxPublic.Log;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
using WxPayAPI;
namespace WxPay.Controllers
{
 public class ResultNotifyController : Controller
 {
  // GET: ResultNotify
  public ActionResult Index()
  {
   string strData = ProcessNotify();
   Response.Write(strData);
   return View();
  }
  public string ProcessNotify()
  {
   WxPayData notifyData = GetNotifyData();
   //检查支付结果中transaction_id是否存在
   if (!notifyData.IsSet("transaction_id"))
   {
    //若transaction_id不存在,则立即返回结果给微信支付后台
    WxPayData res = new WxPayData();
    res.SetValue("return_code", "FAIL");
    res.SetValue("return_msg", "支付结果中微信订单号不存在");
    return res.ToXml();
   }
   string transaction_id = notifyData.GetValue("transaction_id").ToString();
   //查询订单,判断订单真实性
   if (!QueryOrder(transaction_id))
   {
    //若订单查询失败,则立即返回结果给微信支付后台
    WxPayData res = new WxPayData();
    res.SetValue("return_code", "FAIL");
    res.SetValue("return_msg", "订单查询失败");
    return res.ToXml();
   }
   //查询订单成功
   else
   {
    WxPayData res = new WxPayData();
    res.SetValue("return_code", "SUCCESS");
    res.SetValue("return_msg", "OK");
    Log.Info(this.GetType().ToString(), "order query success : " + res.ToXml());
    string strXml = res.ToXml();
    FileLog.WriteLog(strXml);
    return res.ToXml();//如果我们走到这一步了,那就代表,用户已经支付成功了,所以,该干嘛干嘛了。
   }
  }
  /// <summary>
  /// 接收从微信支付后台发送过来的数据并验证签名
  /// </summary>
  /// <returns>微信支付后台返回的数据</returns>
  public WxPayData GetNotifyData()
  {
   //接收从微信后台POST过来的数据
   System.IO.Stream s = Request.InputStream;
   int count = 0;
   byte[] buffer = new byte[1024];
   StringBuilder builder = new StringBuilder();
   while ((count = s.Read(buffer, 0, 1024)) > 0)
   {
    builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
   }
   s.Flush();
   s.Close();
   s.Dispose();
   Log.Info(this.GetType().ToString(), "Receive data from WeChat : " + builder.ToString());
   //转换数据格式并验证签名
   WxPayData data = new WxPayData();
   try
   {
    data.FromXml(builder.ToString());
   }
   catch (WxPayException ex)
   {
    //若签名错误,则立即返回结果给微信支付后台
    WxPayData res = new WxPayData();
    res.SetValue("return_code", "FAIL");
    res.SetValue("return_msg", ex.Message);
    Log.Error(this.GetType().ToString(), "Sign check error : " + res.ToXml());
    return res;
   }
   
   return data;
  }
  //查询订单
  private bool QueryOrder(string transaction_id)
  {
   WxPayData req = new WxPayData();
   req.SetValue("transaction_id", transaction_id);
   WxPayData res = WxPayApi.OrderQuery(req);
   if (res.GetValue("return_code").ToString() == "SUCCESS" &&
    res.GetValue("result_code").ToString() == "SUCCESS")
   {
    return true;
   }
   else
   {
    return false;
   }
  }
 }
}