接上一篇继续,用户在扫描完二维码支付的时候,会显示用户在请求数据中传递的一些数据,例如订单号之类的。如图:
用户交易完成之后,支付宝服务器会主动发起通知,调用商户在请求时设定好的页面路径(参数notify_url,如果商户没有设定,则不会进行该操作),即在biz_data数据中设定的url.
样例:
注:支付宝通知商户支付结果为 post 方法提交请求,以上 GET 方式仅为样例。
商户在接收到支付宝交易的通知数据后,必须向支付宝返回处理结果,简单的来说,就是向页面输出状态:
Response.Write("success");
Response.Write("fail");
另外特别注意的是,前台页面必须不能有任何的html代码和空格
回调页面Notify_Url.aspx代码为
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 notify_data = Request.Form["notify_data"];
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(notify_data);
XmlNode root = xmlDoc.DocumentElement;//返回的根节点
string is_success = root.SelectSingleNode("trade_status").InnerText;
if (is_success == "TRADE_FINISHED" || is_success == "TRADE_SUCCESS")
{
string temp = root.SelectSingleNode("subject").InnerText;//传 的时候把商品名称传成订单号了,所以接收到的也是订单号
string orderNo = temp.Split('-')[1];//订单号
string total_fee = root.SelectSingleNode("total_fee").InnerText;//订单金额
//用户可在这里处理订单情况,修改订单状态等,然后给支付宝服务器返回success,即Response.Write("success")
Response.Write("success"); //请不要修改或删除
}
else
{
Response.Write("fail"); //请不要修改或删除
}
}
else//验证失败
{
Response.Write("fail");
}
}
else
{
Response.Write("无通知参数");
}
}
其中接收到的notify_data数据是一堆xml,我们在接收 的时候可能会出现下面的错误(若没有,则忽略)
解决方法是在配置文件中加上下面这段代码
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
另外,在接收数据的页面上加上 ValidateRequest="false"
至此,支付宝扫码开发的流程基本就结束了,其实也很简单,只要好好的研究文档和Demo,也很容易就做出来了。
如果各位朋友在开发中还有什么问题,可以联系我,我们共同交流。QQ470576160
开发包下载:http://www.7qizhi.com/resource-25.html
Demo下载:http://www.7qizhi.com/resource-37.html