龙空技术网

NET+EF+MVC开发微信JSAPI支付回调页面详细代码

娱乐一分哥 138

前言:

现时各位老铁们对“js微信”大约比较关心,小伙伴们都需要了解一些“js微信”的相关内容。那么小编也在网上汇集了一些对于“js微信””的相关文章,希望各位老铁们能喜欢,同学们一起来学习一下吧!

大家好,我们在开发微信支付时,通常用的较多的有JSAPI支付和Native支付方式,无论哪种方式支付成功后都需要回调页面来更新数据库支付成功的状态或同时处理其它逻辑业务,小编本期详细介绍微信JSAPI支付回调页面的具体写法(下篇文章介绍Native支付回调页面代码):

可以在接口项目里创建wxpay目录,在该目录下创建notify_url.ashx文件,这个需要在商户平台里设置JSAPI支付目录(和此目录对应即可),下面是notify_url.ashx文件完整代码:

using System;

using System.Collections.Generic;

using System.Data.Entity;

using System.IO;

using System.Linq;

using System.Linq.Expressions;

using System.Web;

using HX.Common.Extensionses;

using Webdiyer.WebControls.Mvc;

using WisdomStarts.Model;

using System.Text;

using System.Data;

using System.Data.SqlClient;

using WisdomStarts.DBUtility;

using System.Xml;

using EntityFramework.Extensions;

namespace Wisdomstarts.API.wxpay

{

/// <summary>

/// 2022-10-12 yefei

/// </summary>

public class notify_url : IHttpHandler

{

public string return_result = "";

public void ProcessRequest(HttpContext context)

{

WisdomStarsEntities ef = new WisdomStarsEntities();

context.Response.ContentType = "text/plain";

// context.Response.Write("Hello World");

WisdomStarts.Common.Log.NetLog.WriteTextLog("请求了该页面:", "wxpay/notify_url.asphx");

String xmlData = getPostStr();//获取请求数据

if (xmlData == "")

{

}

else

{

var dic = new Dictionary<string, string>

{

{"return_code", "SUCCESS"},

{"return_msg","OK"}

};

var sb = new StringBuilder();

sb.Append("<xml>");

foreach (var d in dic)

{

sb.Append("<" + d.Key + ">" + d.Value + "</" + d.Key + ">");

}

sb.Append("</xml>");

//把数据重新返回给客户端

DataSet ds = new DataSet();

StringReader stram = new StringReader(xmlData);

XmlTextReader datareader = new XmlTextReader(stram);

ds.ReadXml(datareader);

if (ds.Tables[0].Rows[0]["return_code"].ToString() == "SUCCESS")

{

string wx_appid = "";//微信开放平台审核通过的应用APPID

string wx_mch_id = "";//微信支付分配的商户号

string wx_nonce_str = "";// 随机字符串,不长于32位

string wx_sign = "";//签名,详见签名算法

string wx_result_code = "";//SUCCESS/FAIL

string wx_return_code = "";

string wx_openid = "";//用户在商户appid下的唯一标识

string wx_is_subscribe = "";//用户是否关注公众账号,Y-关注,N-未关注,仅在公众账号类型支付有效

string wx_trade_type = "";// APP

string wx_bank_type = "";// 银行类型,采用字符串类型的银行标识,银行类型见银行列表

string wx_fee_type = "";// 货币类型,符合ISO4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型

string wx_transaction_id = "";//微信支付订单号

string wx_out_trade_no = "";//商户系统的订单号,与请求一致。

string wx_time_end = "";// 支付完成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则

int wx_total_fee = -1;// 订单总金额,单位为分

int wx_cash_fee = -1;//现金支付金额订单现金支付金额,详见支付金额

#region 数据解析

//列 是否存在

string signstr = "";//需要前面的字符串

//wx_appid

if (ds.Tables[0].Columns.Contains("appid"))

{

wx_appid = ds.Tables[0].Rows[0]["appid"].ToString();

if (!string.IsNullOrEmpty(wx_appid))

{

signstr += "appid=" + wx_appid;

}

}

//wx_bank_type

if (ds.Tables[0].Columns.Contains("bank_type"))

{

wx_bank_type = ds.Tables[0].Rows[0]["bank_type"].ToString();

if (!string.IsNullOrEmpty(wx_bank_type))

{

signstr += "&bank_type=" + wx_bank_type;

}

}

//wx_cash_fee

if (ds.Tables[0].Columns.Contains("cash_fee"))

{

wx_cash_fee = Convert.ToInt32(ds.Tables[0].Rows[0]["cash_fee"].ToString());

signstr += "&cash_fee=" + wx_cash_fee;

}

//wx_fee_type

if (ds.Tables[0].Columns.Contains("fee_type"))

{

wx_fee_type = ds.Tables[0].Rows[0]["fee_type"].ToString();

if (!string.IsNullOrEmpty(wx_fee_type))

{

signstr += "&fee_type=" + wx_fee_type;

}

}

//wx_is_subscribe

if (ds.Tables[0].Columns.Contains("is_subscribe"))

{

wx_is_subscribe = ds.Tables[0].Rows[0]["is_subscribe"].ToString();

if (!string.IsNullOrEmpty(wx_is_subscribe))

{

signstr += "&is_subscribe=" + wx_is_subscribe;

}

}

//wx_mch_id

if (ds.Tables[0].Columns.Contains("mch_id"))

{

wx_mch_id = ds.Tables[0].Rows[0]["mch_id"].ToString();

if (!string.IsNullOrEmpty(wx_mch_id))

{

signstr += "&mch_id=" + wx_mch_id;

}

}

//wx_nonce_str

if (ds.Tables[0].Columns.Contains("nonce_str"))

{

wx_nonce_str = ds.Tables[0].Rows[0]["nonce_str"].ToString();

if (!string.IsNullOrEmpty(wx_nonce_str))

{

signstr += "&nonce_str=" + wx_nonce_str;

}

}

//wx_openid

if (ds.Tables[0].Columns.Contains("openid"))

{

wx_openid = ds.Tables[0].Rows[0]["openid"].ToString();

if (!string.IsNullOrEmpty(wx_openid))

{

signstr += "&openid=" + wx_openid;

}

}

//wx_out_trade_no

if (ds.Tables[0].Columns.Contains("out_trade_no"))

{

wx_out_trade_no = ds.Tables[0].Rows[0]["out_trade_no"].ToString();

if (!string.IsNullOrEmpty(wx_out_trade_no))

{

signstr += "&out_trade_no=" + wx_out_trade_no;

}

}

//wx_result_code

if (ds.Tables[0].Columns.Contains("result_code"))

{

wx_result_code = ds.Tables[0].Rows[0]["result_code"].ToString();

if (!string.IsNullOrEmpty(wx_result_code))

{

signstr += "&result_code=" + wx_result_code;

}

}

//wx_result_code

if (ds.Tables[0].Columns.Contains("return_code"))

{

wx_return_code = ds.Tables[0].Rows[0]["return_code"].ToString();

if (!string.IsNullOrEmpty(wx_return_code))

{

signstr += "&return_code=" + wx_return_code;

}

}

//wx_sign

if (ds.Tables[0].Columns.Contains("sign"))

{

wx_sign = ds.Tables[0].Rows[0]["sign"].ToString();

//if (!string.IsNullOrEmpty(wx_sign))

//{

// signstr += "&sign=" + wx_sign;

//}

}

//wx_time_end

if (ds.Tables[0].Columns.Contains("time_end"))

{

wx_time_end = ds.Tables[0].Rows[0]["time_end"].ToString();

if (!string.IsNullOrEmpty(wx_time_end))

{

signstr += "&time_end=" + wx_time_end;

}

}

//wx_total_fee

if (ds.Tables[0].Columns.Contains("total_fee"))

{

wx_total_fee = Convert.ToInt32(ds.Tables[0].Rows[0]["total_fee"].ToString());

signstr += "&total_fee=" + wx_total_fee;

}

//wx_trade_type

if (ds.Tables[0].Columns.Contains("trade_type"))

{

wx_trade_type = ds.Tables[0].Rows[0]["trade_type"].ToString();

if (!string.IsNullOrEmpty(wx_trade_type))

{

signstr += "&trade_type=" + wx_trade_type;

}

}

//wx_transaction_id

if (ds.Tables[0].Columns.Contains("transaction_id"))

{

wx_transaction_id = ds.Tables[0].Rows[0]["transaction_id"].ToString();

if (!string.IsNullOrEmpty(wx_transaction_id))

{

signstr += "&transaction_id=" + wx_transaction_id;

}

}

#endregion

WisdomStarts.Common.Log.NetLog.WriteTextLog("请求SUCCESS成功wxpay/订单号为:", wx_out_trade_no);

//追加key 密钥

signstr += "&key=" + System.Web.Configuration.WebConfigurationManager.AppSettings["wx_key3"].ToString();

//签名正确

string orderStrwhere = "ordernumber='" + wx_out_trade_no + "'";

if (wx_sign == System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(signstr, "MD5").ToUpper())

{

WisdomStarts.Common.Log.NetLog.WriteTextLog("签名成功wxpay/订单号为:", wx_out_trade_no);

//签名正确,以下是处理订单操作业务逻辑

decimal wx_out_trade_no1 = decimal.Parse(wx_out_trade_no.ToString());

//更新主订单状态

HX_ufx_contract m1 = ef.HX_ufx_contract.Where(a => a.contractOrderid == wx_out_trade_no1).AsNoTracking().FirstOrDefault();

if (m1 != null)

{

int result = ef.HX_ufx_contract.Where(a => a.contractOrderid == wx_out_trade_no1).AsNoTracking().Update(a => new HX_ufx_contract

{

paystate = 1,

PayMethodID = 5,

payTime = DateTime.Now

});

if (result > 0)

{

HX_ufx_user user_M = ef.HX_ufx_user.Where(a => a.ufx_userid == m1.ufx_userid).AsNoTracking().FirstOrDefault();

ef.HX_ufx_user.Where(a => a.ufx_userid == m1.ufx_userid).AsNoTracking().Update(a => new HX_ufx_user

{

//更新个人本金,合作本金待回收金额,和子公司本金

cooperPrincipalAmount = user_M.cooperPrincipalAmount + m1.ht_cooperPrincipalAmount,

cooperPrincipalTobeRecoverAmount = user_M.cooperPrincipalTobeRecoverAmount + m1.ht_cooperPrincipalAmount,

subsidiaryPrincipal = user_M.subsidiaryPrincipal + m1.subsidiaryPrincipal,

relationship = 0, //渠道身份0,非渠道身份为1

customerstate = 2 //用户状态 0 跟进中 1 公海 2 已签约 4 无效

});

}

context.Response.Write("success");

}

else

{

HX_ufx_contractPaydetail m2 = ef.HX_ufx_contractPaydetail.Where(a => a.contractPayDetailOrderid == wx_out_trade_no1).AsNoTracking().FirstOrDefault();

if (m2 != null)

{

ef.HX_ufx_contractPaydetail.Where(a => a.contractPayDetailOrderid == wx_out_trade_no1).AsNoTracking().Update(a => new HX_ufx_contractPaydetail

{

paystate = 1,

PayMethodID = 5,

payTime = DateTime.Now

});

}

context.Response.Write("success");

}

}

else

{

//追加备注信息

context.Response.Write("false");

}

}

else

{

// 返回信息,如非空,为错误原因 签名失败 参数格式校验错误

string return_msg = ds.Tables[0].Rows[0]["return_msg"].ToString();

}

return_result = sb.ToString();

}

}

public bool IsReusable

{

get

{

return false;

}

}

//获得Post过来的数据

public string getPostStr()

{

Int32 intLen = Convert.ToInt32(System.Web.HttpContext.Current.Request.InputStream.Length);

byte[] b = new byte[intLen];

System.Web.HttpContext.Current.Request.InputStream.Read(b, 0, intLen);

return System.Text.Encoding.UTF8.GetString(b);

}

}

}

标签: #js微信