1.asp.net支付宝接口,付款部分

最近刚做了个支付宝的接口,简单给大家分享一下,支付宝有专门的客服,不懂就给你说,服务还是不错的,当然人家是赚钱的1.2%的交易服用啊

接口有4中,分别是双标准接口,担保接口,即时到帐接口,纯网银接口,前两种是你支付宝个人就可以申请,后两种需要企业级别的才可以

我这次给大家做的就是

/// 担保交易的交易状态变化顺序是:等待买家付款→买家已付款,等待卖家发货→卖家已发货,等待买家收货→买家已收货,交易完成
/// 即时到帐的交易状态变化顺序是:等待买家付款→交易完成

其实我们做的部分不是很多,最重要的是让支付宝返回的状态和你的网站的订单一直就可以,别人家付款了,你网站还没更改

我的数据库存了三个bool字段,pay(付款),sendto(发货),success(成功),用支付宝返回的状态(异步)里面写sql语句,去更改就是了,插入订单的时机在顾客填写完订单,并向支付宝条状的时候。

不废话了,看代码吧

去支付宝商家服务里面,下载相关的源代码

我这里直说那些需要我们修改的

1.AlipayConfig.cs

//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

//合作身份者ID,以2088开头由16位纯数字组成的字符串

partner = "你的pid";

//交易安全检验码,由数字和字母组成的32位字符串
key = "你的key";

//签约支付宝账号或卖家支付宝帐户
seller_email = "你的支付宝账号";

//你的页面跳转同步返回页面文件路径 要用 http://格式的完整路径,不允许加?id=123这类自定义参数
return_url = "http://localhost:1336/return_url.aspx";

//你的服务器通知的页面文件路径 要用 http://格式的完整路径,不允许加?id=123这类自定义参数
notify_url = "http://localhost:1336/notify_url.aspx";


//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

 

2,填写订单页面,复制default.cs里面的代码,并添加自己的插入语句,然后会跳转到支付宝页面

////////////////////////////////////////////请求参数////////////////////////////////////////////

//必填参数//

string out_trade_no = DateTime.Now.ToString("yyyyMMddHHmmss"); //请与贵网站订单系统中的唯一订单号匹配
string subject = Session["title"].ToString(); //订单名称,显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。
string body = txtbeizhu.Text; //订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里
Session["body"] = txtbeizhu.Text;
Session["price"] = LiteralPrice.Text;
string price = "0.01"; //订单总金额,显示在支付宝收银台里的“商品单价”里

string logistics_fee = "0.00"; //物流费用,即运费。
string logistics_type = "EXPRESS"; //物流类型,三个值可选:EXPRESS(快递)、POST(平邮)、EMS(EMS)
string logistics_payment = "SELLER_PAY"; //物流支付方式,两个值可选:SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费)

string quantity = "1"; //商品数量,建议默认为1,不改变值,把一次交易看成是一次下订单而非购买一件商品。

//选填参数//

//买家收货信息(推荐作为必填)
//该功能作用在于买家已经在商户网站的下单流程中填过一次收货信息,而不需要买家在支付宝的付款流程中再次填写收货信息。
//若要使用该功能,请至少保证receive_name、receive_address有值
//收货信息格式请严格按照姓名、地址、邮编、电话、手机的格式填写
string receive_name = txtname.Text; //收货人姓名,如:张三
Session["receive_name"] = receive_name;
//string receive_address = "收货人地址"; //收货人地址,如:XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号
//string receive_zip = "123456"; //收货人邮编,如:123456
//string receive_phone = "0571-81234567"; //收货人电话号码,如:0571-81234567
string receive_mobile = txtphone.Text; //收货人手机号码,如:13312341234
Session["receive_mobile"] = receive_mobile;

string chengrencount = Literalchengren.Text;
string ertongcount = Literalertong.Text;
Session["chengrenertongcount"] = ertongcount + chengrencount;
//网站商品的展示地址,不允许加?id=123这类自定义参数
string show_url = "http://www.xxx.com/myorder.aspx";
//INSERT INTO Orders (TravelTitle, Counts, [Money], Linkman, Phone, [Describe], Pay, [Datetime]) VALUES ('天马岛', '2成人1儿童', '200', '张总', '15092877791', '全家', 0, #7/3/2012#);
string sql = string.Format("INSERT INTO Orders ([out_trade_no],[TravelTitle], [Counts], [Money], [Linkman], Phone, [Describe], [Datetime],[UserName],[type],[namecard]) values('" + out_trade_no + "','" + Session["title"].ToString() + "','" + Session["chengrenertongcount"].ToString() + "','" + Session["price"].ToString() + "','" + Session["receive_name"].ToString() + "','" + Session["receive_mobile"].ToString() + "','" + Session["body"].ToString() + "','" + DateTime.Now.ToString() + "','" + Session["shouji"] + "',1,'" + trresults + "')");
if (DataBase.ExecuteNonQuery(sql) > 0)
{
Response.Write("<script type='text/javascript'>alert('订单生成成功,跳转到支付宝页面!');</script>");
//Response.Redirect("Traveljingdian.aspx?yy=" + InfoClassID + "");
}
else
{
Response.Write("<script type='text/javascript'>alert('订单生成失败!');</script>");
}

////////////////////////////////////////////////////////////////////////////////////////////////

//把请求参数打包成数组
SortedDictionary<string, string> sParaTemp = new SortedDictionary<string, string>();
sParaTemp.Add("body", body);
sParaTemp.Add("logistics_fee", logistics_fee);
sParaTemp.Add("logistics_payment", logistics_payment);
sParaTemp.Add("logistics_type", logistics_type);
sParaTemp.Add("out_trade_no", out_trade_no);
sParaTemp.Add("payment_type", "1");
sParaTemp.Add("price", price);
sParaTemp.Add("quantity", quantity);
//sParaTemp.Add("receive_address", receive_address);
sParaTemp.Add("receive_mobile", receive_mobile);
sParaTemp.Add("receive_name", receive_name);
//sParaTemp.Add("receive_phone", receive_phone);
//sParaTemp.Add("receive_zip", receive_zip);
sParaTemp.Add("show_url", show_url);
sParaTemp.Add("subject", subject);

//构造标准双接口表单提交HTML数据,无需修改
Service ali = new Service();
string sHtmlText = ali.Trade_create_by_buyer(sParaTemp);
Response.Write(sHtmlText);

 

3,支付状态返回,有同步return_url.aspx和异步notify_url.aspx,同步不用管,直接在notify_url.aspx里面写sql操作你自己的数据库,比如支付了,就去你插入的那条订单里面修改相应的字段为true,这里面没有session,没有js,只是写sql语句去操作你数据库,保证支付宝返回的订单和你的数据库一致就可以,用来操作的where,使用你网站的订单号对应支付宝返回的交易。号发货成功后,异步页面也会返回发货成的状态,相应sql代码,上一篇已经写了,异步就是从支付宝服务器给你网站发送的状态,所有状态都会返回给你的网站,包括顾客确认收货,也会给你的网站返回交易成功的状态,所以相应的代码写在异步页面就可以,同步有时状态会接受不到,异步必须放在服务器上测试,同步可以在本地测试支付成功的时候用

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 Com.Alipay;

/// <summary>
/// 功能:服务器异步通知页面
/// 版本:3.2
/// 日期:2011-03-11
/// 说明:
/// 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
/// 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
///
/// ///////////////////页面功能说明///////////////////
/// 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。
/// 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。
/// 该页面调试工具请使用写文本函数logResult。
/// 如果没有收到该页面返回的 success 信息,支付宝会在24小时内按一定的时间策略重发通知
/// WAIT_BUYER_PAY(表示买家已在支付宝交易管理中产生了交易记录,但没有付款);
/// WAIT_SELLER_SEND_GOODS(表示买家已在支付宝交易管理中产生了交易记录且付款成功,但卖家没有发货);
/// WAIT_BUYER_CONFIRM_GOODS(表示卖家已经发了货,但买家还没有做确认收货的操作);
/// TRADE_FINISHED(表示买家已经确认收货,这笔交易完成);
///
/// 如何判断该笔交易是通过即时到帐方式付款还是通过担保交易方式付款?
///
/// 担保交易的交易状态变化顺序是:等待买家付款→买家已付款,等待卖家发货→卖家已发货,等待买家收货→买家已收货,交易完成
/// 即时到帐的交易状态变化顺序是:等待买家付款→交易完成
///
/// 每当收到支付宝发来通知中,就可以获取到这笔交易的交易状态,并且商户需要利用商户订单号查询商户网站的订单数据,
/// 得到这笔订单在商户网站中的状态是什么,把商户网站中的订单状态与从支付宝通知中获取到的状态来做对比。
/// 如果商户网站中目前的状态是等待买家付款,而从支付宝通知获取来的状态是买家已付款,等待卖家发货,那么这笔交易买家是用担保交易方式付款的
/// 如果商户网站中目前的状态是等待买家付款,而从支付宝通知获取来的状态是交易完成,那么这笔交易买家是用即时到帐方式付款的
/// </summary>
public partial class notify_url : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
SortedDictionary<string, string> sPara = GetRequestPost();

if (sPara.Count > 0)//判断是否有带返回参数
{
Notify aliNotify = new Notify();
bool verifyResult = aliNotify.Verify(sPara, Request.Form["notify_id"], Request.Form["sign"]);

if (verifyResult)//验证成功
{
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//请在这里加上商户的业务逻辑程序代码

//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
string trade_no = Request.Form["trade_no"]; //支付宝交易号
string order_no = Request.Form["out_trade_no"]; //获取订单号
string total_fee = Request.Form["price"]; //获取总金额
string subject = Request.Form["subject"]; //商品名称、订单名称
string body = Request.Form["body"]; //商品描述、订单备注、描述
string buyer_email = Request.Form["buyer_email"]; //买家支付宝账号
string trade_status = Request.Form["trade_status"]; //交易状态

if (Request.Form["trade_status"] == "WAIT_BUYER_PAY")
{//该判断表示买家已在支付宝交易管理中产生了交易记录,但没有付款

//判断该笔订单是否在商户网站中已经做过处理(可参考“集成教程”中“3.4返回数据处理”)
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序

}
else if (Request.Form["trade_status"] == "WAIT_SELLER_SEND_GOODS")
{//该判断示买家已在支付宝交易管理中产生了交易记录且付款成功,但卖家没有发货

//判断该笔订单是否在商户网站中已经做过处理(可参考“集成教程”中“3.4返回数据处理”)
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序SELECT count(*) FROM Traveljingdian WHERE yy=3

string sqlselecttrade_no = "select count(*) from orders where (OrdersNo='" + trade_no + "')";
if (DataBase.ExecuteScalar(sqlselecttrade_no).ToString() == "0")
{
string inserttrade_no = "UPDATE Orders SET OrdersNo='" + trade_no + "' WHERE (out_trade_no = '" + order_no + "')";
if (DataBase.ExecuteNonQuery(inserttrade_no) > 0)
{
}
}

string sql = "UPDATE Orders SET pay = 1 WHERE (out_trade_no = '" + order_no + "')";
if (DataBase.ExecuteNonQuery(sql) > 0)
{
Response.Write("success"); //请不要修改或删除
}

 

}
else if (Request.Form["trade_status"] == "WAIT_BUYER_CONFIRM_GOODS")
{//该判断表示卖家已经发了货,但买家还没有做确认收货的操作

//判断该笔订单是否在商户网站中已经做过处理(可参考“集成教程”中“3.4返回数据处理”)
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
string sql = "UPDATE Orders SET sendout = 1 WHERE (out_trade_no = '" + order_no + "')";
if (DataBase.ExecuteNonQuery(sql) > 0)
{
Response.Write("success"); //请不要修改或删除
}
}
else if (Request.Form["trade_status"] == "TRADE_FINISHED")
{//该判断表示买家已经确认收货,这笔交易完成

//判断该笔订单是否在商户网站中已经做过处理(可参考“集成教程”中“3.4返回数据处理”)
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
string sql = "UPDATE Orders SET succeed = 1 WHERE (out_trade_no = '" + order_no + "')";
if (DataBase.ExecuteNonQuery(sql) > 0)
{
Response.Write("success"); //请不要修改或删除
}
}
else
{
Response.Write("success"); //其他状态判断。
}

//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else//验证失败
{
Response.Write("fail");
}
}
else
{
Response.Write("无通知参数");
}
}

/// <summary>
/// 获取支付宝POST过来通知消息,并以“参数名=参数值”的形式组成数组
/// </summary>
/// <returns>request回来的信息组成的数组</returns>
public SortedDictionary<string, string> GetRequestPost()
{
int i = 0;
SortedDictionary<string, string> sArray = new SortedDictionary<string, string>();
NameValueCollection coll;
//Load Form variables into NameValueCollection variable.
coll = Request.Form;

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

for (i = 0; i < requestItem.Length; i++)
{
sArray.Add(requestItem[i], Request.Form[requestItem[i]]);
}

return sArray;
}
}

posted on 2012-07-19 11:10  张彦山  阅读(2526)  评论(0编辑  收藏  举报