支付宝扫码支付方式,说简单也简单,只要是对接过支付宝接口的朋友,再做支付宝扫码,可以说是非常的简单,因为根本就没有变多了,相对来说,反而更简单了些,下面就让我来详细的给大家演示一下开发过程。
首先,当我们拿到开发包的时候,开发包下载:支付宝扫码支付即时到账开发包
请看下图:
大概就这么多的文件,我们找到code_demo文件夹里面的alipay.mobile.qrcode.manage-CSHARP的demo,可以参考一下,然后开始做我们自己的开发。
一般来说,对接支付方式就是按照他们的要求格式将所需的数据推送给他们,然后他们会返回给商户一些请求结果,商户根据返回的结果做相应的逻辑处理。
支付宝二维码开发的步骤也是如此,按照支付宝开发文档上的步骤来,第一步就是商户生成二维码,商户生成二维码的过程需要我们根据支付宝提供的接口规则,构造要传输给支付宝的数据集合,然后通过页面链接跳转或表单提交的方式传递给支付宝;然后支付宝会对请求的数据进行处理,经过一系列验证通过后便会处理完成这次发送过来的数据请求,对于处理完成的交易,支付宝会以某种形式的数据反馈给我们的网站程序。
首先是构造请求数据和处理支付宝返回数据:
protected void Page_Load(object sender, EventArgs e)
{
string orderNo = Request.QueryString["no"];//订单号
if (string.IsNullOrEmpty(orderNo))
{
Response.Write("订单编号错误!");
return;
}
//取得要支付的金额
decimal totalPrice = decimal.Parse(Request.QueryString["Total"]);
////////////////////////////////////////////请求参数////////////////////////////////////////////
//接口调用时间 格式为:yyyy-MM-dd HH:mm:ss
string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//动作
string method = "add";
//创建商品二维码
//业务类型
string biz_type = "10";
//json数据
string biz_data = GetBizData(orderNo,totalPrice);
//把请求参数打包成数组
SortedDictionary<string, string> sParaTemp = new SortedDictionary<string, string>();
sParaTemp.Add("service", "alipay.mobile.qrcode.manage");
sParaTemp.Add("partner", Config.Partner);
sParaTemp.Add("_input_charset", Config.Input_charset.ToLower());
sParaTemp.Add("timestamp", timestamp);
sParaTemp.Add("method", method);
sParaTemp.Add("biz_type", biz_type);
sParaTemp.Add("biz_data", biz_data);
string _sign = "";
foreach (var item in sParaTemp.OrderBy(s => s.Key))
{
_sign = appendParam(_sign, item.Key, item.Value);
}
//签名
string sign = AlipayMD5.Sign(_sign, Config.Key, Config.Input_charset.ToLower());
sParaTemp.Add("sign_type", Config.Sign_type);
sParaTemp.Add("sign", sign);
//建立请求
string sHtmlText = Submit.BuildRequest(sParaTemp);
//请在这里加上商户的业务逻辑程序代码
XmlDocument xmlDoc = new XmlDocument();
try
{
xmlDoc.LoadXml(sHtmlText);
XmlNode root = xmlDoc.DocumentElement;//返回的根节点
string is_success = root.SelectSingleNode("is_success").InnerText;
if (is_success == "T")
{
string result_code = root.SelectSingleNode("/alipay/response/alipay/result_code").InnerText;
if (result_code == "SUCCESS")
{
string qrcode = root.SelectSingleNode("/alipay/response/alipay/qrcode").InnerText;//二维码地址
string qrcode_img_url = root.SelectSingleNode("/alipay/response/alipay/qrcode_img_url").InnerText;//二维码图片地址
//显示二维码
Response.Redirect("/CreateQRCode.aspx?URL=" + qrcode_img_url + "&orderno=" + orderNo + "&cashm=" + totalPrice);
}
else
{
Response.Write("业务处理失败!");
}
}
else
{
Response.Write("请求失败!");
}
}
catch
{
Response.Write("系统异常!");
}
}
其中在拼接biz_data数据的时候,商户可根据情况来取舍,有些数据不用传(看文档要求)
/// <summary>
/// 获取json数据
/// </summary>
/// <param name="orderModel"></param>
/// <returns></returns>
private string GetBizData(string OrderNo,decimal price)
{
StringBuilder sbJson = new StringBuilder();
//有些数据不必传
sbJson.Append("{");
sbJson.AppendFormat(""need_address":"{0}",", "F");//是否需要收货地址:T需要,F不需要
sbJson.AppendFormat(""trade_type":"{0}",", "1");//交易类型,1 即时到账
sbJson.AppendFormat(""notify_url":"{0}",", "http://www.xxxxx.com/OnlinePay/AlipayQRCode/Notify_Url.aspx");
string goods = ""goods_info":{"id":"" + OrderNo + "","name":"" + OrderNo + "","price":""+price+ ""}";
sbJson.Append(goods);
//sbJson.AppendFormat(""memo":{0}", "memo");备注
sbJson.Append("}");
return sbJson.ToString();
}
把正确的数据发送给支付宝服务器之后,支付宝对商户提供的请求数据进行处理后,返回给商户结果数据,以便商户根据数据进一步处理(生成二维码)
在建立请求这一步完成之后,即下面这一步:
string sHtmlText = Submit.BuildRequest(sParaTemp);
执行完了之后,服务器返回的正确的XML形式是这样的:
<?xml version="1.0" encoding="utf-8"?>
<alipay>
<is_success>T</is_success>
<request>
<param name="sign">e4886e6ac2bdd177780291cac8275549</param>
<param name="timestamp">2015-04-09 18:02:02</param>
<param name="_input_charset">utf-8</param>
<param name="biz_type">10</param>
<param name="biz_data">{"need_address":"F","trade_type":"1","notify_url":"http://www.xxxxx.com/OnlinePay/AlipayQRCode/Notify_Url.aspx","goods_info":{"id":"130723565644339531","name":"130723565644339531","price":"58.90"}}</param>
<param name="sign_type">MD5</param>
<param name="service">alipay.mobile.qrcode.manage</param>
<param name="method">add</param>
<param name="partner">2088212334266517</param>
</request>
<response>
<alipay>
<qrcode>https://qr.alipay.com/gdcb3cplbcwmsu142b</qrcode>
<qrcode_img_url>https://mobilecodec.alipay.com/show.htm?code=gdcb3cplbcwmsu142b&anp;picSize=S</qrcode_img_url>
<result_code>SUCCESS</result_code>
</alipay>
</response>
<sign>f30b5b091676cefdcbc1c67b04463178</sign>
<sign_type>MD5</sign_type>
</alipay>
至于其他情况返回的数据,请看文档中5.3,上面有详细的说明。
返回的数据中,在:
<response>
<alipay>
<qrcode>https://qr.alipay.com/gdcb3cplbcwmsu142b</qrcode>
<qrcode_img_url>https://mobilecodec.alipay.com/show.htm?code=gdcb3cplbcwmsu142b&anp;picSize=S</qrcode_img_url>
<result_code>SUCCESS</result_code>
</alipay>
</response>
里面就是二维码图片的链接地址和二维码的地址,然后我们就可以通过将二维码图片的地址提取出来,然后赋值到一个图片标签的src属性上即能显示出二维码图片了
//显示二维码
Response.Redirect("/CreateQRCode.aspx?URL=" + qrcode_img_url + "&orderno=" +orderNo + "&cashm=" + totalPrice);
CreateQRCode.aspx页面中代码:
展示效果图为:
至此,二维码生成!在用户扫描了二维码之后,支付宝服务器会将用户的交易结果返回给我们处理,我会在下一篇博客详细的说明。