204 lines
12 KiB
C#
204 lines
12 KiB
C#
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();
|
||
//订单提交时间,格式:yyyyMMddHHmmss,如:20071117020101,该值与提交时相同。
|
||
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();
|
||
//快钱交易时间,快钱对交易进行处理的时间,格式:yyyyMMddHHmmss,如:20071117020101
|
||
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;
|
||
}
|
||
}
|
||
} |