欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

asp.net 支付寶及時(shí)到帳接口使用詳解

 更新時(shí)間:2010年03月12日 20:59:49   作者:  
這兩天寫支付寶接口, 這個(gè)話題不新了, 因?yàn)楹芏嗳硕?做過了, 在這里我說說我的看法吧, 先說一下實(shí)現(xiàn)

其實(shí)支付寶公司已經(jīng)給我們做的很好了, 只要少量的改動(dòng)就OK了,只是有的程序員不太明天他們的動(dòng)作流程而以,我就以及時(shí)到帳為例子來說了,呵呵

在這之前就大家先下載一下c#版的及時(shí)到帳代碼    這里是下載地址http://dev.alipay.com/devclub/mvnforum/viewthread_thread,4;jsessionid=595DB7442AAA5CD2FC849E7C2FBE51D7

 

先看一下程序的結(jié)構(gòu)吧

 

 

支付寶有一個(gè)類文件叫  AliPay 是一些加密算法之類的東西,包括構(gòu)造URL

要吧看一下這個(gè)類的全部內(nèi)容

復(fù)制代碼 代碼如下:

using System.Web;
using System.Text;
using System.Security.Cryptography;
using System.IO;
using System.Net;
using System;
/// <summary>
/// New Interface for AliPay
/// </summary>
namespace Gateway
{
public class AliPay
{
/// <summary>
/// 與ASP兼容的MD5加密算法
/// </summary>
public static string GetMD5(string s, string _input_charset)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] t = md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(s));
StringBuilder sb = new StringBuilder(32);
for (int i = 0; i < t.Length; i++)
{
sb.Append(t[i].ToString("x").PadLeft(2, '0'));
}
return sb.ToString();
}
/// <summary>
/// 冒泡排序法
/// 按照字母序列從a到z的順序排列
/// </summary>
public static string[] BubbleSort(string[] r)
{
int i, j; //交換標(biāo)志
string temp;
bool exchange;
for (i = 0; i < r.Length; i++) //最多做R.Length-1趟排序
{
exchange = false; //本趟排序開始前,交換標(biāo)志應(yīng)為假
for (j = r.Length - 2; j >= i; j--)
{//交換條件
if (System.String.CompareOrdinal(r[j + 1], r[j]) < 0)
{
temp = r[j + 1];
r[j + 1] = r[j];
r[j] = temp;
exchange = true; //發(fā)生了交換,故將交換標(biāo)志置為真
}
}
if (!exchange) //本趟排序未發(fā)生交換,提前終止算法
{
break;
}
}
return r;
}
/// <summary>
/// 生成URL鏈接或加密結(jié)果
/// </summary>
/// <param name="para">參數(shù)加密數(shù)組</param>
/// <param name="_input_charset">編碼格式</param>
/// <param name="sign_type">加密類型</param>
/// <param name="key">安全校驗(yàn)碼</param>
/// <returns>字符串URL或加密結(jié)果</returns>
public static string CreatUrl(
//string gateway,//GET方式傳遞參數(shù)時(shí)請(qǐng)去掉注釋
string[] para,
string _input_charset,
string sign_type,
string key
)
{
int i;
//進(jìn)行排序;
string[] Sortedstr = BubbleSort(para);
//構(gòu)造待md5摘要字符串 ;
StringBuilder prestr = new StringBuilder();
for (i = 0; i < Sortedstr.Length; i++)
{
if (i == Sortedstr.Length - 1)
{
prestr.Append(Sortedstr[i]);
}
else
{
prestr.Append(Sortedstr[i] + "&");
}
}
prestr.Append(key);
//生成Md5摘要;
string sign = GetMD5(prestr.ToString(), _input_charset);
//以下是POST方式傳遞參數(shù)
return sign;
//以下是GET方式傳遞參數(shù)
//構(gòu)造支付Url;
// char[] delimiterChars = { '='};
// StringBuilder parameter = new StringBuilder();
// parameter.Append(gateway);
// for (i = 0; i < Sortedstr.Length; i++)
// {//UTF-8格式的編碼轉(zhuǎn)換
// parameter.Append(Sortedstr[i].Split(delimiterChars)[0] + "=" + HttpUtility.UrlEncode(Sortedstr[i].Split(delimiterChars)[1]) + "&");
// }
//
// parameter.Append("sign=" + sign + "&sign_type=" + sign_type);
//
// //返回支付Url;
// return parameter.ToString();
}
//獲取遠(yuǎn)程服務(wù)器ATN結(jié)果,驗(yàn)證是否是支付寶服務(wù)器發(fā)來的請(qǐng)求
public static string Get_Http(string a_strUrl, int timeout)
{
string strResult;
try
{
HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(a_strUrl);
myReq.Timeout = timeout;
HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse();
Stream myStream = HttpWResp.GetResponseStream();
StreamReader sr = new StreamReader(myStream, Encoding.Default);
StringBuilder strBuilder = new StringBuilder();
while (-1 != sr.Peek())
{
strBuilder.Append(sr.ReadLine());
}
strResult = strBuilder.ToString();
}
catch (Exception exp)
{
strResult = "錯(cuò)誤:" + exp.Message;
}
return strResult;
}
}
}

而我們一般不用管這個(gè)類,只要保證能調(diào)用 的到就行了,不用管他

    我們要做的很少,他是怎么工作的呢,

   這是開發(fā)文檔里的工作圖

其實(shí)我們要處理的只有三個(gè)Aspx的文件,

先看第一個(gè)吧   Default.aspx

這是一個(gè)請(qǐng)求的界面

復(fù)制代碼 代碼如下:

using System;
using System.Data;
using System.Configuration;
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 Gateway;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}
protected void BtnAlipay_Click(object sender, EventArgs e)
{
//業(yè)務(wù)參數(shù)賦值;
string gateway = "https://www.alipay.com/cooperate/gateway.do?"; //支付接口
string service = "create_direct_pay_by_user"; //服務(wù)名稱,這個(gè)是識(shí)別是何接口實(shí)現(xiàn)何功能的標(biāo)識(shí),請(qǐng)勿修改

string seller_email = "寫自己的"; //商家簽約時(shí)的支付寶帳號(hào),即收款的支付寶帳號(hào)
string sign_type = "MD5"; //加密類型,簽名方式“不用改”
string key = "寫自己的"; //安全校驗(yàn)碼,與partner是一組,獲取方式是:用簽約時(shí)支付寶帳號(hào)登陸支付寶網(wǎng)站www.alipay.com,在商家服務(wù)我的商家里即可查到。
string partner = "寫自己的"; //商戶ID,合作身份者ID,合作伙伴ID
string _input_charset = "utf-8"; //編碼類型,完全根據(jù)客戶自身的項(xiàng)目的編碼格式而定,千萬不要填錯(cuò)。否則極其容易造成MD5加密錯(cuò)誤。

string show_url = "http://www.alipay.com/"; //展示地址,即在支付頁面時(shí),商品名稱旁邊的“詳情”的鏈接地址。

string out_trade_no = TxtOrderno.Text.Trim(); //客戶自己的訂單號(hào),訂單號(hào)必須在自身訂單系統(tǒng)中保持唯一性
string subject = "4.0系統(tǒng)支付寶充值"; //商品名稱,也可稱為訂單名稱,該接口并不是單一的只能買一樣?xùn)|西,可把一次支付當(dāng)作一次下訂單
string body = "商戶:" + TxtOrderno.Text.Trim() + "通過支付寶給自己充值:" + TxtTotal_fee.Text.Trim() + "元"; //商品描述,即備注
string total_fee = TxtTotal_fee.Text.Trim(); //商品價(jià)格,也可稱為訂單的總金額

//服務(wù)器通知url(Alipay_Notify.aspx文件所在路經(jīng)),必須是完整的路徑地址
string notify_url = http://0.0.6.108/Alipay/Alipay_Notify.aspx;
//服務(wù)器返回url(Alipay_Return.aspx文件所在路經(jīng)),必須是完整的路徑地址
string return_url = http://0.0.6.108/Alipay/Alipay_Return.aspx;

//構(gòu)造數(shù)組;
//以下數(shù)組即是參與加密的參數(shù),若參數(shù)的值不允許為空,若該參數(shù)為空,則不要成為該數(shù)組的元素
string[] para ={
"service="+service,
"partner=" + partner,
"seller_email=" + seller_email,
"out_trade_no=" + out_trade_no,
"subject=" + subject,
"body=" + body,
"total_fee=" + total_fee,
"show_url=" + show_url,
"payment_type=1",
"notify_url=" + notify_url,
"return_url=" + return_url,
"_input_charset="+_input_charset
};

//支付URL生成
string aliay_url = AliPay.CreatUrl(
//gateway,//GET方式傳遞參數(shù)時(shí)請(qǐng)去掉注釋
para,
_input_charset,
sign_type,
key
);

//以下是GET方式傳遞參數(shù)
//Response.Redirect(aliay_url);


//以下是POST方式傳遞參數(shù)
Response.Write("<form name='alipaysubmit' method='post' action='https://www.alipay.com/cooperate/gateway.do?_input_charset=utf-8'>");
Response.Write("<input type='hidden' name='service' value=" + service + ">");
Response.Write("<input type='hidden' name='partner' value=" + partner + ">");
Response.Write("<input type='hidden' name='seller_email' value=" + seller_email + ">");
Response.Write("<input type='hidden' name='out_trade_no' value=" + out_trade_no + ">");
Response.Write("<input type='hidden' name='subject' value=" + subject + ">");
Response.Write("<input type='hidden' name='body' value=" + body + ">");
Response.Write("<input type='hidden' name='total_fee' value=" + total_fee + ">");
Response.Write("<input type='hidden' name='show_url' value=" + show_url + ">");
Response.Write("<input type='hidden' name='return_url' value=" + return_url + ">");
Response.Write("<input type='hidden' name='notify_url' value=" + notify_url + ">");
Response.Write("<input type='hidden' name='payment_type' value=1>");
Response.Write("<input type='hidden' name='sign' value=" + aliay_url + ">");
Response.Write("<input type='hidden' name='sign_type' value=" + sign_type + ">");
Response.Write("</form>");
Response.Write("<script>");
Response.Write("document.alipaysubmit.submit()");
Response.Write("</script>");
}
}

代碼里的key和 partner的獲取方法

現(xiàn)在我們只要按代碼里的信息填寫一樣就可以了,

然后遠(yuǎn)行網(wǎng)頁

點(diǎn)提交

就會(huì)進(jìn)入

下面的操作就是在支付平臺(tái)的完成了, 跟咱的程序沒有關(guān)系了

現(xiàn)在我們應(yīng)該想,那付完錢之后呢?

我們有兩個(gè)界面來處理這個(gè)問題一個(gè)是

Alipay_Return.aspx

復(fù)制代碼 代碼如下:

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.Text;
using System.Collections.Specialized;
using System.IO;
using Gateway;

/// <summary>
/// 創(chuàng)建該頁面文件時(shí),請(qǐng)留心該頁面文件是可以對(duì)其進(jìn)行美工處理的,原因在于支付完成以后,當(dāng)前窗口會(huì)從支付寶的頁面跳轉(zhuǎn)回這個(gè)頁面。
/// 該頁面稱作“返回頁”,是同步被支付寶服務(wù)器所調(diào)用,可當(dāng)作是支付完成后的提示信息頁,如“您的某某某訂單,多少金額已支付成功”。
/// </summary>
public partial class Alipay_Return : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string alipayNotifyURL = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify";
//string alipayNotifyURL = "http://notify.alipay.com/trade/notify_query.do?";//此路徑是在上面鏈接地址無法起作用時(shí)替換使用。
string key = "寫自己的"; //partner 的對(duì)應(yīng)交易安全校驗(yàn)碼(必須填寫)
string partner = "寫自己的"; //partner合作伙伴id(必須填寫)
string _input_charset = "utf-8";//編碼類型,完全根據(jù)客戶自身的項(xiàng)目的編碼格式而定,千萬不要填錯(cuò)。否則極其容易造成MD5加密錯(cuò)誤。

alipayNotifyURL = alipayNotifyURL + "&partner=" + partner + "&notify_id=" + Request.QueryString["notify_id"];

//獲取支付寶ATN返回結(jié)果,true是正確的訂單信息,false 是無效的
string responseTxt = AliPay.Get_Http(alipayNotifyURL, 120000);

//*******加密簽名程序開始//*******
int i;
NameValueCollection coll;
//Load Form variables into NameValueCollection variable.
coll = Request.QueryString;

// Get names of all forms into a string array.
String[] requestarr = coll.AllKeys;

//進(jìn)行排序;
string[] Sortedstr = AliPay.BubbleSort(requestarr);

//構(gòu)造待md5摘要字符串 ;

StringBuilder prestr = new StringBuilder();

for (i = 0; i < Sortedstr.Length; i++)
{
if (Request.Form[Sortedstr[i]] != "" && Sortedstr[i] != "sign" && Sortedstr[i] != "sign_type")
{
if (i == Sortedstr.Length - 1)
{
prestr.Append(Sortedstr[i] + "=" + Request.QueryString[Sortedstr[i]]);
}
else
{
prestr.Append(Sortedstr[i] + "=" + Request.QueryString[Sortedstr[i]] + "&");

}
}
}

prestr.Append(key);

//生成Md5摘要;
string mysign = AliPay.GetMD5(prestr.ToString(), _input_charset);
//*******加密簽名程序結(jié)束*******

string sign = Request.QueryString["sign"];

// Response.Write(prestr.ToString()); //調(diào)試用,支付寶服務(wù)器返回時(shí)的完整路徑。

if (mysign == sign && responseTxt == "true") //驗(yàn)證支付發(fā)過來的消息,簽名是否正確
{

//更新自己數(shù)據(jù)庫的訂單語句,請(qǐng)自己填寫一下
string strOrderNO = Request.QueryString["out_trade_no"];//訂單號(hào)
string strPrice = Request.QueryString["total_fee"];//金額
string strTradeStatus = Request.QueryString["TRADE_STATUS"];//訂單狀態(tài)

//生成對(duì)象
//OfficeFinanceServices objOfficeFinanceServices = new OfficeFinanceServices();

//訂單信息
string[] login = strOrderNO.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries);

////查詢當(dāng)前的余額
//decimal objdm = objOfficeFinanceServices.OfficeFinanceSelect(Convert.ToInt32(login[0].ToString().Trim()), true);
//OfficeFinance objofficeFinance = new OfficeFinance();
//objofficeFinance.ofId = Convert.ToInt32(login[0].ToString().Trim());
//objofficeFinance.ofOrid = "cz";
//objofficeFinance.ofTime = DateTime.Now;
//objofficeFinance.ofType = 1;
//objofficeFinance.ofAmount = Convert.ToDecimal(strPrice.ToString().Trim());
//objofficeFinance.ofRemainAmount = Convert.ToDecimal(strPrice.ToString().Trim()) + objdm;
//objofficeFinance.ofIsCurrentValue = 1;
//objofficeFinance.ofUserId = -10;
//objofficeFinance.ofNote1 = "支付寶上帳:" + strPrice.ToString().Trim() + "元";
//objofficeFinance.ofNote2 = "商戶:" + login[1].ToString().Trim() + " 通過支付寶上帳金額:" + strPrice + "元";
//objOfficeFinanceServices.addOfficeFinanceOne(objofficeFinance);

Response.Write("商戶:" + login[1].ToString().Trim() + "<br>金額:" + strPrice + " 交易成功"); //成功,可美化該頁面,提示信息



////寫文本,紀(jì)錄支付寶返回消息,比對(duì)md5計(jì)算結(jié)果(如網(wǎng)站不支持寫txt文件,可改成寫數(shù)據(jù)庫)
string TOEXCELLR = "MD5結(jié)果:mysign=" + mysign + ",sign=" + sign + ",responseTxt=" + responseTxt + " 交易信息" + "商戶:" + login[1].ToString().Trim() + "<br>金額:" + strPrice + " 交易成功";
StreamWriter fs = new StreamWriter(Server.MapPath("Return_DATA/" + DateTime.Now.ToString().Replace(":", "")) + ".txt", false, System.Text.Encoding.Default);
fs.Write(TOEXCELLR);
fs.Close();
}
else
{
Response.Write("------------------------------------------");
Response.Write("<br>Result:responseTxt=" + responseTxt);
Response.Write("<br>Result:mysign=" + mysign);
Response.Write("<br>Result:sign=" + sign);
Response.Write("支付失敗");

////寫文本,紀(jì)錄支付寶返回消息,比對(duì)md5計(jì)算結(jié)果(如網(wǎng)站不支持寫txt文件,可改成寫數(shù)據(jù)庫)
string TOEXCELLR = "MD5結(jié)果:mysign=" + mysign + ",sign=" + sign + ",responseTxt=" + responseTxt;
StreamWriter fs = new StreamWriter(Server.MapPath("Return_DATA/" + DateTime.Now.ToString().Replace(":", "")) + ".txt", false, System.Text.Encoding.Default);
fs.Write(TOEXCELLR);
fs.Close();

//支付失敗,提示信息
}
}
}

這個(gè)是當(dāng)交易成功后要調(diào)用 的界面 在這里只要改動(dòng)一下就行了, 其實(shí)我們要做的只是改一下這里,只要在這里更新一下你的數(shù)據(jù)庫就行了,
代碼
復(fù)制代碼 代碼如下:

//生成對(duì)象
//OfficeFinanceServices objOfficeFinanceServices = new OfficeFinanceServices();
//訂單信息
string[] login = strOrderNO.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries);
////查詢當(dāng)前的余額
//decimal objdm = objOfficeFinanceServices.OfficeFinanceSelect(Convert.ToInt32(login[0].ToString().Trim()), true);
//OfficeFinance objofficeFinance = new OfficeFinance();
//objofficeFinance.ofId = Convert.ToInt32(login[0].ToString().Trim());
//objofficeFinance.ofOrid = "cz";
//objofficeFinance.ofTime = DateTime.Now;
//objofficeFinance.ofType = 1;
//objofficeFinance.ofAmount = Convert.ToDecimal(strPrice.ToString().Trim());
//objofficeFinance.ofRemainAmount = Convert.ToDecimal(strPrice.ToString().Trim()) + objdm;
//objofficeFinance.ofIsCurrentValue = 1;
//objofficeFinance.ofUserId = -10;
//objofficeFinance.ofNote1 = "支付寶上帳:" + strPrice.ToString().Trim() + "元";
//objofficeFinance.ofNote2 = "商戶:" + login[1].ToString().Trim() + " 通過支付寶上帳金額:" + strPrice + "元";
//objOfficeFinanceServices.addOfficeFinanceOne(objofficeFinance);

大家現(xiàn)在會(huì)問我為什么會(huì)把他們注釋了呢?
我測試過,,這個(gè)界面呢是只到成功的時(shí)候 調(diào)用 一次以后就再不會(huì)調(diào)用 了,
所以這樣有一個(gè)不好的地方 ,就是有些客戶他們對(duì)轉(zhuǎn)帳操作的很老手,當(dāng)交易成功之后不等調(diào)用這個(gè)界面就關(guān)閉了瀏覽器,這個(gè)時(shí)候會(huì)出現(xiàn)什么問題呢?
那支付寶就再也不會(huì)調(diào)用這個(gè)界面 了,只能等下次交易,錢是打上了,我們也收到了,但是就是沒有給客戶充上錢,這個(gè)時(shí)候客戶就會(huì)打電話到公司,怎么回事啊, 錢打過去了, 可是我這邊還沒有上帳,我們上支付寶一看有啊,但就是沒有上帳 ,怎么辦,最后只能手動(dòng)給客戶上了,但又怕他程序再自動(dòng)上一把,呵呵
所以在這里不我建議使用這個(gè)頁面,如果你只是修改自己的訂單狀態(tài)的話當(dāng)然是可以的
修改余額就不要在這里寫了,而是寫在這個(gè)Alipay_Notify.aspx頁面里,這個(gè)界面是當(dāng)交易狀態(tài) 發(fā)生變化時(shí)就會(huì)調(diào)用 ,在沒有收到成功的消息前就會(huì)一直調(diào)用,
時(shí)效是24小時(shí),這樣的話我們就不用管他是不是轉(zhuǎn)到了成功頁面了,只要把這個(gè)頁面掛在網(wǎng)上等通知就行了,
當(dāng)交易成功的時(shí)候上帳 就OK了
代碼
復(fù)制代碼 代碼如下:

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.Text;
using System.Collections.Specialized;
using System.IO;
using Gateway;
using SystemModel;
/// <summary>
/// 創(chuàng)建該頁面文件時(shí),請(qǐng)留心該頁面文件中無任何HTML代碼及空格。
/// 該頁面稱作“通知頁”,是異步被支付寶服務(wù)器所調(diào)用。
/// 當(dāng)支付寶的訂單狀態(tài)改變時(shí),支付寶服務(wù)器則會(huì)自動(dòng)調(diào)用此頁面,因此請(qǐng)做好自身網(wǎng)站訂單信息與支付寶上的訂單的同步工作
/// </summary>
public partial class Alipay_Notify : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string alipayNotifyURL = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify";
//string alipayNotifyURL = "http://notify.alipay.com/trade/notify_query.do?";//此路徑是在上面鏈接地址無法起作用時(shí)替換使用。
string partner = "寫自己的"; //partner合作伙伴id(必須填寫)
string key = "寫自己的"; //partner 的對(duì)應(yīng)交易安全校驗(yàn)碼(必須填寫)
string _input_charset = "utf-8";//編碼類型,完全根據(jù)客戶自身的項(xiàng)目的編碼格式而定,千萬不要填錯(cuò)。否則極其容易造成MD5加密錯(cuò)誤。
alipayNotifyURL = alipayNotifyURL + "&partner=" + partner + "&notify_id=" + Request.Form["notify_id"];
//獲取支付寶ATN返回結(jié)果,true是正確的訂單信息,false 是無效的
string responseTxt = AliPay.Get_Http(alipayNotifyURL, 120000);
//*******加密簽名程序開始*******
int i;
NameValueCollection coll;
//Load Form variables into NameValueCollection variable.
coll = Request.Form;
// Get names of all forms into a string array.
String[] requestarr = coll.AllKeys;
//進(jìn)行排序;
string[] Sortedstr = AliPay.BubbleSort(requestarr);
//構(gòu)造待md5摘要字符串 ;
StringBuilder prestr = new StringBuilder();
for (i = 0; i < Sortedstr.Length; i++)
{
if (Request.Form[Sortedstr[i]] != "" && Sortedstr[i] != "sign" && Sortedstr[i] != "sign_type")
{
if (i == Sortedstr.Length - 1)
{
prestr.Append(Sortedstr[i] + "=" + Request.Form[Sortedstr[i]]);
}
else
{
prestr.Append(Sortedstr[i] + "=" + Request.Form[Sortedstr[i]] + "&");
}
}
}
prestr.Append(key);
string mysign = AliPay.GetMD5(prestr.ToString(), _input_charset);
//*******加密簽名程序結(jié)束*******
string sign = Request.Form["sign"];
if (mysign == sign && responseTxt == "true") //驗(yàn)證支付發(fā)過來的消息,簽名是否正確,只要成功進(jìn)如這個(gè)判斷里,則表示該頁面已被支付寶服務(wù)器成功調(diào)用
//但判斷內(nèi)出現(xiàn)自身編寫的程序相關(guān)錯(cuò)誤導(dǎo)致通知給支付寶并不是發(fā)送success的消息或沒有更新客戶自身的數(shù)據(jù)庫的情況,請(qǐng)自身程序編寫好應(yīng)對(duì)措施,否則查明原因時(shí)困難之極
{
if (Request.Form["trade_status"] == "WAIT_BUYER_PAY")// 判斷支付狀態(tài)_等待買家付款(文檔中有枚舉表可以參考)
{
//更新自己數(shù)據(jù)庫的訂單語句,請(qǐng)自己填寫一下
string strOrderNO = Request.Form["out_trade_no"];//訂單號(hào)
string strPrice = Request.Form["total_fee"];//金額 如果你申請(qǐng)了商家購物卷功能,在返回信息里面請(qǐng)不要做金額的判斷,否則會(huì)校驗(yàn)通過不了。
string TOEXCELL = "MD5結(jié)果:mysign=" + mysign + ",sign=" + sign + ",responseTxt=" + responseTxt;
StreamWriter f = new StreamWriter(Server.MapPath("Notify_DATA/" + DateTime.Now.ToString().Replace(":", "")) + ".txt", false, System.Text.Encoding.Default);
f.Write(TOEXCELL + "訂單號(hào):" + strOrderNO.ToString().Trim() + " 金額:" + strPrice.ToString().Trim());
f.Close();
Alipaym objalipay = new Alipaym();
objalipay.APID = strOrderNO;
objalipay.addTime = DateTime.Now;
objalipay.total_fee = Convert.ToDecimal(strPrice);
objalipay.trade_status = "等待買家付款";
objalipay.Text1 = DateTime.Now.ToString();
objalipay.Text2 = "";
objalipay.Text3 = "";
objalipay.Text4 = "";
objalipay.Text5 = "";
OfficeFinanceServices.Update(objalipay);
}
else if (Request.Form["trade_status"] == "TRADE_FINISHED" || Request.Form["trade_status"] == "TRADE_SUCCESS")// 判斷支付狀態(tài)_交易成功結(jié)束(文檔中有枚舉表可以參考)
{
//更新自己數(shù)據(jù)庫的訂單語句,請(qǐng)自己填寫一下
string strOrderNO = Request.Form["out_trade_no"];//訂單號(hào)
string strPrice = Request.Form["total_fee"];//金額
//生成對(duì)象
OfficeFinanceServices objOfficeFinanceServices = new OfficeFinanceServices();
//訂單信息
string[] login = strOrderNO.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries);
////查詢當(dāng)前的余額
decimal objdm = objOfficeFinanceServices.OfficeFinanceSelect(Convert.ToInt32(login[0].ToString().Trim()), true);
OfficeFinance objofficeFinance = new OfficeFinance();
objofficeFinance.ofId = Convert.ToInt32(login[0].ToString().Trim());
objofficeFinance.ofOrid = "cz";
objofficeFinance.ofTime = DateTime.Now;
objofficeFinance.ofType = 1;
objofficeFinance.ofAmount = Convert.ToDecimal(strPrice.ToString().Trim());
objofficeFinance.ofRemainAmount = Convert.ToDecimal(strPrice.ToString().Trim()) + objdm;
objofficeFinance.ofIsCurrentValue = 1;
objofficeFinance.ofUserId = -10;
objofficeFinance.ofNote1 = "支付寶上帳:" + strPrice.ToString().Trim() + "元";
objofficeFinance.ofNote2 = "商戶:" + login[1].ToString().Trim() + " 通過支付寶上帳金額:" + strPrice + "元";
if (objOfficeFinanceServices.addOfficeFinanceOne(objofficeFinance))
{
Response.Write("success");
Alipaym objalipay = new Alipaym();
objalipay.APID = strOrderNO;
objalipay.addTime = DateTime.Now;
objalipay.total_fee = Convert.ToDecimal(strPrice);
objalipay.trade_status = "交易成功";
objalipay.Text1 = DateTime.Now.ToString();
objalipay.Text2 = "";
objalipay.Text3 = "";
objalipay.Text4 = "";
objalipay.Text5 = "";
OfficeFinanceServices.Update(objalipay);
}
else
{
Response.Write("fail");
}
}
else
{
//更新自己數(shù)據(jù)庫的訂單語句,請(qǐng)自己填寫一下
}
//Response.Write("success"); //返回給支付寶消息,成功,請(qǐng)不要改寫這個(gè)success
//success與fail及其他字符的區(qū)別在于,支付寶的服務(wù)器若遇到success時(shí),則不再發(fā)送請(qǐng)求通知(即不再調(diào)用該頁面,讓該頁面再次運(yùn)行起來),
//若不是success,則支付寶默認(rèn)沒有收到成功的信息,則會(huì)反復(fù)不停地調(diào)用該頁面直到失效,有效調(diào)用時(shí)間是24小時(shí)以內(nèi)。
////寫文本,紀(jì)錄支付寶返回消息,比對(duì)md5計(jì)算結(jié)果(如網(wǎng)站不支持寫txt文件,可改成寫數(shù)據(jù)庫)
string TOEXCELLR = "MD5結(jié)果:mysign=" + mysign + ",sign=" + sign + ",responseTxt=" + responseTxt;
StreamWriter fs = new StreamWriter(Server.MapPath("Notify_DATA/" + DateTime.Now.ToString().Replace(":", "")) + ".txt", false, System.Text.Encoding.Default);
fs.Write(TOEXCELLR);
fs.Close();
}
else
{
Response.Write("fail");
//寫文本,紀(jì)錄支付寶返回消息,比對(duì)md5計(jì)算結(jié)果(如網(wǎng)站不支持寫txt文件,可改成寫數(shù)據(jù)庫)
string TOEXCELLR = "MD5結(jié)果:mysign=" + mysign + ",sign=" + sign + ",responseTxt=" + responseTxt;
StreamWriter fs = new StreamWriter(Server.MapPath("Notify_DATA/" + DateTime.Now.ToString().Replace(":", "")) + ".txt", false, System.Text.Encoding.Default);
fs.Write(TOEXCELLR);
fs.Close();
}
}
}

最好是記錄一下日志文件,這樣一但出了問題還可以有個(gè)參考的地方
我的代碼寫的有點(diǎn)亂大家可以適當(dāng)?shù)母囊幌?,呵?
來自 sufei1013

相關(guān)文章

  • ASP.NET Core中的對(duì)象池介紹

    ASP.NET Core中的對(duì)象池介紹

    這篇文章介紹了ASP.NET Core中的對(duì)象池,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • ASP.NET?MVC授權(quán)過濾器用法

    ASP.NET?MVC授權(quán)過濾器用法

    這篇文章介紹了ASP.NET?MVC授權(quán)過濾器的用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • asp.net小孔子cms中的數(shù)據(jù)添加修改

    asp.net小孔子cms中的數(shù)據(jù)添加修改

    最近都在看小孔子cms的代碼,其添加與修改數(shù)據(jù)十分方便,做下筆記,代碼主要提取自小孔子cms,去掉了不用的函數(shù)并把相關(guān)代碼寫到一個(gè)文件中
    2008-08-08
  • GridView生成的HTML代碼示例對(duì)比

    GridView生成的HTML代碼示例對(duì)比

    很多初學(xué)者都奇怪GridView生成的HTML代碼到底是什么,下面有個(gè)示例對(duì)比,需要的朋友可以參考下
    2014-02-02
  • asp.net網(wǎng)站安全從小做起與防范小結(jié)

    asp.net網(wǎng)站安全從小做起與防范小結(jié)

    我是做asp.net網(wǎng)站開發(fā)的,QQ群里一個(gè)網(wǎng)友的站被掛馬了。他說讓我寫點(diǎn)安全方面的文章。我就介紹下我的經(jīng)驗(yàn)吧,各位大牛不要拿磚頭砸我。。。
    2008-09-09
  • 利用ASP.NET MVC+EasyUI+SqlServer搭建企業(yè)開發(fā)框架

    利用ASP.NET MVC+EasyUI+SqlServer搭建企業(yè)開發(fā)框架

    本文主要介紹使用asp.net mvc4、sqlserver、jquery2.0和easyui1.4.5搭建企業(yè)級(jí)開發(fā)框架的過程,希望能夠幫到大家。
    2016-04-04
  • 合并兩個(gè)DataSet的數(shù)據(jù)內(nèi)容的方法

    合并兩個(gè)DataSet的數(shù)據(jù)內(nèi)容的方法

    合并兩個(gè)DataSet的數(shù)據(jù)內(nèi)容的方法,需要的朋友可以參考一下
    2013-03-03
  • asp.net 簡單單點(diǎn)登錄技術(shù)分析

    asp.net 簡單單點(diǎn)登錄技術(shù)分析

    單點(diǎn)登錄,又叫SSO(Single Sign On)。在一些cms或者OA中比較常用到這種登錄模式,目的是為防止重復(fù)登錄。而其實(shí)現(xiàn)原理也頗為簡單,只要Cache的形式就可以實(shí)現(xiàn),這里只用于簡單記錄下,呵呵……
    2011-02-02
  • 解決AJAX.NET中的懸停panel在頁面加載時(shí)閃爍的問題

    解決AJAX.NET中的懸停panel在頁面加載時(shí)閃爍的問題

    AJAX.NET的兩個(gè)懸停控件.分別是HoverMenuExtender和ModalPopupExtender.他們可以打造很好的懸停效果...通常,我都是用panel來作為懸停內(nèi)容的容器..
    2009-06-06
  • asp.net 簡便無刷新文件上傳系統(tǒng)

    asp.net 簡便無刷新文件上傳系統(tǒng)

    之前寫過一個(gè)仿163網(wǎng)盤無刷新多文件上傳系統(tǒng),已經(jīng)對(duì)無刷新上傳文件的原理做了詳細(xì)的分析而這次的系統(tǒng)主要是針對(duì)單個(gè)file控件的,便攜版,使用更簡單,還有更深入的分析
    2012-05-05

最新評(píng)論