ASP.NET支付宝扫码即时到账支付开发流程(上)

  支付宝扫码支付方式,说简单也简单,只要是对接过支付宝接口的朋友,再做支付宝扫码,可以说是非常的简单,因为根本就没有变多了,相对来说,反而更简单了些,下面就让我来详细的给大家演示一下开发过程。

首先,当我们拿到开发包的时候,开发包下载:支付宝扫码支付即时到账开发包 

请看下图:


    大概就这么多的文件,我们找到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页面中代码:



展示效果图为:


至此,二维码生成!在用户扫描了二维码之后,支付宝服务器会将用户的交易结果返回给我们处理,我会在下一篇博客详细的说明。


开发包下载:http://www.7qizhi.com/resource-25.html

Demo下载:http://www.7qizhi.com/resource-37.html

posted on 2017-05-18 20:12  带刀侍卫++i  阅读(6252)  评论(0编辑  收藏  举报

导航