zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    GitHub入门教程
    转:使用ActiveX插件时object显示问题,div被object标签遮挡的解决方案
    windows集成资料
    转:获取windows凭证管理器明文密码
    转: OVER() 系列函数介绍
    SQL Prompt 快捷键
    转:敏捷开发之Scrum扫盲篇
    转:修改IIS虚拟目录名称bat脚本
    转:EditPuls 5.0 注册码
    转:RowVersion 用法
  • 原文地址:https://www.cnblogs.com/wanzhongjun/p/6875365.html
Copyright © 2011-2022 走看看