最详细的ASP.NET微信JS-SDK支付代码

2019-05-26 04:05:23王振洲

TestJs.aspx内容:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="JsPay.aspx.cs" Inherits="WeChatPayDemo.JsPay" %>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title></title>
 <script src="//www.easck.comhttps://www.easck.com/d/file/190526/0405232130-0.jpg"></script>
 <script src="Scripts/wxpay.js"></script>
 <script>
 $(function () {
  $("#submit").click(function () {
  var OID ="<%=openid%>";
  alert(OID);
  $.get("WxPay/WxPay.ashx?action=jspayparam", {
   body: $("#body").val(),
   total_fee: $("#price").val(),
   out_trade_no: $("#order").val(),
   trade_type: "JSAPI",
   msgid: "<%=openid%>"

  }, function (data) {
   WxPay.Pay(data.appId, data.timeStamp, data.nonceStr, data.package, data.signType, data.paySign, function () {
   alert("支付成功");
   });
  }, "json");

  });
 })
 </script>
</head>
<body>
 <form id="form1" runat="server">
 <div>
  商品描述:<input type="text" id="body" />
  商品价格:<input type="text" id="price" />
  订单号:<input type="text" id="order" />
  <input type="button" value="提交订单" id="submit" />
 </div>
 </form>
</body>
</html>

JsPay.aspx.cs代码:

 public partial class JsPay : System.Web.UI.Page
 {
 public string openid = "";
 protected void Page_Load(object sender, EventArgs e)
 {
  string code = Request["code"];
  if (string.IsNullOrEmpty(code))
  {
  //如果code没获取成功,重新拉取一遍
  GetAuthUrl("wxxxxxxxxxxxxxxxxxxxxxxx", "http://www.china101.net/JsPay.aspx");
  }

  openid = GetOpenID("wxxxxxxxxxxxxxxxxxxxxxxx", "dsdssdsdsdsdsdsdsdsdsd", JKRequest.GetQueryString("code"), () => { });
 }
 public string GetOpenID(string appid, string secret, string code, Action CallBack)
 {
  try
  {
  string retdata = Utils.HttpGet(string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", appid, secret, code));
  .LogHelper.WriteFile(retdata);
  JObject jobj = (JObject)JsonConvert.DeserializeObject(retdata);
  string openid = jobj.Value<string>("openid");
  return openid;
  }
  catch (Exception)
  {
  CallBack();
  return "";
  }
  // return GetUserInfo(access_token, openid);
 }

 /// <summary>
 /// 获取鉴权地址
 /// </summary>
 /// <param name="appid"></param>
 /// <param name="redirect_url"></param>
 /// <returns></returns>
 public void GetAuthUrl(string appid, string redirect_url)
 {
  Response.Redirect(string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_base&state=123#wechat_redirect", appid, Utils.UrlEncode(redirect_url)));
 }
 }

WxPay.ashx代码:

/// <summary>
 /// WxPay 的摘要说明
 /// </summary>
 public class WxPay : IHttpHandler
 {
 /// <summary>
 /// 公众账号ID
 /// </summary>
 private string appid = "wxxxxxxxxxxxxxxxx";
 /// <summary>
 /// 商户号
 /// </summary>
 private string mch_id = "12333333333";
 /// <summary>
 /// 通知url
 /// </summary>
 private string notify_url = "http://www.china101.net/Notify2.aspx";
 /// <summary>
 /// 密钥
 /// </summary>
 private string key = "chinapagexxxxxxxxxxxxx";
 public void ProcessRequest(HttpContext context)
 {
  string action = JKRequest.GetQueryString("action");
  switch (action)
  {
  case "unifysign":
   GetUnifySign(context); break;
  case "jspayparam": GetJsPayParam(context); break;
  case "nativedynamic": GetPayQr(context); break;

  }
 }
 #region 获取js支付参数

 void GetJsPayParam(HttpContext context)
 {
  JsEntities jsEntities = new JsEntities()
  {
  appId = appid,
  nonceStr = .Utils.GetRandom(),
  package = string.Format("prepay_id={0}", GetPrepayId(context)),
  signType = "MD5",
  timeStamp = .Utils.ConvertDateTimeInt(DateTime.Now).ToString()
  };
  string url, sign;
  string xmlStr = .Utils.GetUnifyRequestXml<JsEntities>(jsEntities, key, out url, out sign);
  LogHelper.WriteFile(xmlStr);
  jsEntities.paySign = sign;
  context.Response.Write(JsonConvert.SerializeObject(jsEntities));
 }
 #endregion
 #region 获取预支付ID


 //--------------------------------------------------------------------------
 string GetPrepayId(HttpContext context)
 {
  string xml;
  GetUnifySign(context, out xml);
  LogHelper.WriteFile("GetPrepayId---71--" + xml);
  UnifyReceive unifyReceive = new UnifyReceive(.Utils.HttpPost("https://api.mch.weixin.qq.com/pay/unifiedorder", xml));
  LogHelper.WriteFile("unifyReceive---73--" + unifyReceive.prepay_id);
  return unifyReceive.prepay_id;
 }
 #endregion
 #region 获取统一签名
 void GetUnifySign(HttpContext context)
 {
  string xml;
  context.Response.Write(GetUnifySign(context, out xml));
 }
 #endregion
 #region 获取统一签名

 string GetUnifySign(HttpContext context, out string xml)
 {
  string url, sign;
  xml = WxPayHelper.Utils.GetUnifyUrlXml<UnifyEntities>(GetUnifyEntities(context), key, out url, out sign);
  return sign;
 }
 #endregion

 #region 获取二维码

 void GetPayQr(HttpContext context)
 {
  string url = GetPayUrl(context);
  WxPayHelper.Utils.GetQrCode(url);
 }
 #endregion
 #region 获取二维码链接

 string GetPayUrl(HttpContext context)
 {
  string xml;
  GetUnifySign(context, out xml);
  WxPayHelper.Utils.WriteTxt(xml);
  UnifyReceive unifyReceive = new UnifyReceive(WxPayHelper.Utils.HttpPost("https://api.mch.weixin.qq.com/pay/unifiedorder", xml));
  return unifyReceive.code_url;
 }
 #endregion
 #region 获取统一支付接口参数对象

 UnifyEntities GetUnifyEntities(HttpContext context)
 {
  string msgid = JKRequest.GetQueryString("msgid");
  LogHelper.WriteFile("115---------"+msgid);
  UnifyEntities unify = new UnifyEntities
  {
  appid = appid,
  body = JKRequest.GetQueryString("body"),
  mch_id = mch_id,
  nonce_str = WxPayHelper.Utils.GetRandom(),
  out_trade_no = JKRequest.GetQueryString("out_trade_no"),
  notify_url = notify_url,
  spbill_create_ip = JKRequest.GetIP(),
  trade_type = JKRequest.GetQueryString("trade_type"),
  total_fee = JKRequest.GetQueryString("total_fee")
  };
  if (unify.trade_type == "NATIVE")
  {
  unify.product_id = msgid;
  }
  else
  {
  unify.openid = msgid;
  }
  return unify;
 }

 #endregion


 public bool IsReusable
 {
  get
  {
  return false;
  }
 }
 }