Files
g.hnyhua.cn/Mtxfw.shop/pay/kq_receive.aspx.cs
2026-02-07 15:48:27 +08:00

204 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Specialized;
using System.Collections.Generic;
using System.Globalization;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
namespace Mtxfw.shop
{
/// <summary>
/// 功能:服务器异步通知页面
/// 版本3.3
/// 日期2012-07-10
/// 说明:
/// 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
/// 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
///
/// ///////////////////页面功能说明///////////////////
/// 创建该页面文件时请留心该页面文件中无任何HTML代码及空格。
/// 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。
/// 该页面调试工具请使用写文本函数logResult。
/// 如果没有收到该页面返回的 success 信息支付宝会在24小时内按一定的时间策略重发通知
/// </summary>
public partial class kq_receive : System.Web.UI.Page
{
Mtxfw.DAL.user_info daoUser = new Mtxfw.DAL.user_info();
Mtxfw.DAL.order_info daoorder = new Mtxfw.DAL.order_info();
Mtxfw.DAL.user_Results_jl2 daoResults2 = new Mtxfw.DAL.user_Results_jl2();
Mtxfw.DAL.order_product_info daoorderproduct = new Mtxfw.DAL.order_product_info();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
try
{
//人民币网关账号该账号为11位人民币网关商户编号+01,该值与提交时相同。
string merchantAcctId = Request.QueryString["merchantAcctId"].ToString();
//网关版本固定值v2.0,该值与提交时相同。
string version = Request.QueryString["version"].ToString();
//语言种类1代表中文显示2代表英文显示。默认为1,该值与提交时相同。
string language = Request.QueryString["language"].ToString();
//签名类型,该值为4代表PKI加密方式,该值与提交时相同。
string signType = Request.QueryString["signType"].ToString();
//支付方式一般为00代表所有的支付方式。如果是银行直连商户该值为10,该值与提交时相同。
string payType = Request.QueryString["payType"].ToString();
//银行代码如果payType为00该值为空如果payType为10,该值与提交时相同。
string bankId = Request.QueryString["bankId"].ToString();
//商户订单号,,该值与提交时相同。
string orderId = Request.QueryString["orderId"].ToString();
//订单提交时间格式yyyyMMddHHmmss20071117020101,该值与提交时相同。
string orderTime = Request.QueryString["orderTime"].ToString();
//订单金额金额以“分”为单位商户测试以1分测试即可切勿以大金额测试,该值与支付时相同。
string orderAmount = Request.QueryString["orderAmount"].ToString();
// 快钱交易号,商户每一笔交易都会在快钱生成一个交易号。
string dealId = Request.QueryString["dealId"].ToString();
//银行交易号 ,快钱交易在银行支付时对应的交易号,如果不是通过银行卡支付,则为空
string bankDealId = Request.QueryString["bankDealId"].ToString();
//快钱交易时间,快钱对交易进行处理的时间,格式yyyyMMddHHmmss20071117020101
string dealTime = Request.QueryString["dealTime"].ToString();
//商户实际支付金额 以分为单位。比方10元提交时金额应为1000。该金额代表商户快钱账户最终收到的金额。
string payAmount = Request.QueryString["payAmount"].ToString();
//费用,快钱收取商户的手续费,单位为分。
string fee = Request.QueryString["fee"].ToString();
//扩展字段1该值与提交时相同。
string ext1 = Request.QueryString["ext1"].ToString();
//扩展字段2该值与提交时相同。
string ext2 = Request.QueryString["ext2"].ToString();
//处理结果, 10支付成功11 支付失败00订单申请成功01 订单申请失败
string payResult = Request.QueryString["payResult"].ToString();
//错误代码 ,请参照《人民币网关接口文档》最后部分的详细解释。
string errCode = Request.QueryString["errCode"].ToString();
//签名字符串
string signMsg = Request.QueryString["signMsg"].ToString();
string signMsgVal = "";
signMsgVal = appendParam(signMsgVal, "merchantAcctId", merchantAcctId);
signMsgVal = appendParam(signMsgVal, "version", version);
signMsgVal = appendParam(signMsgVal, "language", language);
signMsgVal = appendParam(signMsgVal, "signType", signType);
signMsgVal = appendParam(signMsgVal, "payType", payType);
signMsgVal = appendParam(signMsgVal, "bankId", bankId);
signMsgVal = appendParam(signMsgVal, "orderId", orderId);
signMsgVal = appendParam(signMsgVal, "orderTime", orderTime);
signMsgVal = appendParam(signMsgVal, "orderAmount", orderAmount);
signMsgVal = appendParam(signMsgVal, "dealId", dealId);
signMsgVal = appendParam(signMsgVal, "bankDealId", bankDealId);
signMsgVal = appendParam(signMsgVal, "dealTime", dealTime);
signMsgVal = appendParam(signMsgVal, "payAmount", payAmount);
signMsgVal = appendParam(signMsgVal, "fee", fee);
signMsgVal = appendParam(signMsgVal, "ext1", ext1);
signMsgVal = appendParam(signMsgVal, "ext2", ext2);
signMsgVal = appendParam(signMsgVal, "payResult", payResult);
signMsgVal = appendParam(signMsgVal, "errCode", errCode);
///UTF-8编码 GB2312编码 用户可以根据自己网站的编码格式来选择加密的编码方式
byte[] bytes = System.Text.Encoding.GetEncoding("GB2312").GetBytes(signMsgVal);
//byte[] bytes = System.Text.Encoding.UTF8.GetBytes(signMsgVal);
byte[] SignatureByte = Convert.FromBase64String(signMsg);
X509Certificate2 cert = new X509Certificate2(Server.MapPath("/App_Data/public-rsa.cer"), "");
RSACryptoServiceProvider rsapri = (RSACryptoServiceProvider)cert.PublicKey.Key;
rsapri.ImportCspBlob(rsapri.ExportCspBlob(false));
RSAPKCS1SignatureDeformatter f = new RSAPKCS1SignatureDeformatter(rsapri);
byte[] result;
f.SetHashAlgorithm("SHA1");
SHA1CryptoServiceProvider sha = new SHA1CryptoServiceProvider();
result = sha.ComputeHash(bytes);
if (f.VerifySignature(result, SignatureByte))
{
//逻辑处理 写入数据库
if (payResult == "10")
{
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//请在这里加上商户的业务逻辑程序代码
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理根据订单号out_trade_no在商户网站的订单系统中查到该笔订单的详细并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
//注意:
//该种交易状态只在两种情况下出现
//1、开通了普通即时到账买家付款成功后。
//2、开通了高级即时到账从该笔交易成功时间算起过了签约时的可退款时限三个月以内可退款、一年以内可退款等后。
Mtxfw.Model.user_Results_jl2 ReModel = daoResults2.GetModel(orderId);
if (ReModel != null)
{
if (ReModel.Seef == 0)
{
if (Convert.ToDouble(ReModel.Addmoney.ToString("f2")) == Convert.ToDouble((Convert.ToDouble(orderAmount) / 100).ToString("f2")))
{
daoResults2.UpdateSeef("seef", 1, "seeftime", DateTime.Now, ReModel.Id);
//增加买家余额
daoUser.UpdateMoney("umoney12", ReModel.Addmoney, ReModel.MemberId);
}
}
}
Mtxfw.Utility.Common.WriteHtml("/weixin/weixinerr.txt", payAmount);
//打印页面
Response.Write("<result>1</result>" + "<redirecturl>http://www.hzmfgw.com/pay/kqshow.aspx?msg=0&payAmount=" + payAmount + "</redirecturl>");
}
else
{
//以下是我们快钱设置的show页面商户需要自己定义该页面。
Mtxfw.Utility.Common.WriteHtml("/weixin/weixinerr.txt", payAmount + "|" + payResult);
Response.Write("<result>1</result>" + "<redirecturl>http://www.hzmfgw.com/pay/kqshow.aspx?msg=1</redirecturl>");
}
}
else
{
Mtxfw.Utility.Common.WriteHtml("/weixin/weixinerr.txt", signMsgVal + "|" + signMsg);
Response.Write("signMsgVal=" + "(" + signMsgVal + ")");
Response.Write("</br>" + "signMsg =" + signMsg);
Response.Write("</br>" + "错误");
}
}
catch (Exception ex)
{
Mtxfw.Utility.Common.WriteHtml("/weixin/weixinerr.txt", ex.ToString() + "|" + ex.Message);
}
}
}
//功能函数。将变量值不为空的参数组成字符串
String appendParam(String returnStr, String paramId, String paramValue)
{
if (returnStr != "")
{
if (paramValue != "")
{
returnStr += "&" + paramId + "=" + paramValue;
}
}
else
{
if (paramValue != "")
{
returnStr = paramId + "=" + paramValue;
}
}
return returnStr;
}
}
}