C#對接芝麻信用

最近做了支付寶小程序對接芝麻信用的功能,其實坑挺多的,不過還好在文檔以及客服的幫助下順利完成。

網上有很多相關的博客,但是百分之九十的沒啥用,要麼就是沒有代碼示例,要麼就是代碼不全,根本不能用,還有幾年前的博客 一些接口比如查詢芝麻信用分的接口,問了客服才知道 這個早就淘汰了。所以自己寫一篇比較詳細的供大家參考。一定要記住的一句話是--------遇到問題問客服

流程的話篇博客寫的完全正確:https://blog.csdn.net/webnoties/article/details/103255674

官方文檔:https://opendocs.alipay.com/open/11157/qlsxya

其實需要我們做的一共三步

第一步:調用資金凍結接口-----調用這個接口,你不必知道客戶的信用分夠不夠,你提交數據後支付寶那邊自己會判斷,夠的話就使用信用付,不夠的話就是普通的資金凍結。

第二步:將資金凍結接口返回的數據傳給前端,前端通過這些數據去調起用戶支付寶,用戶進行授權(信用分夠,使用信用付)/支付(信用分不夠,普通的資金凍結---這個時候注意 普通的資金凍結,錢也需要調用授權轉支付接口後纔會到商家的賬上),在用戶授權或支付後 支付寶那邊會調用咱們的異步接口(注意是用戶授權或支付後)   咱們接收到異步通知的信息來知道資金凍結是否成功。成功後就可以讓用戶使用商家的東西了。

第三步:調用授權轉支付接口-----將錢真正打到商戶賬上,這個接口一般來講是用戶在用完商戶的服務後,商戶進行收款。

其實真正的流程就是這三步,其他的接口比如退款/查詢/支付寶訂單信息同步  這些接口我就不寫了,都很簡單,直接按照文檔的示例寫就可以。下面就將前三步的代碼貼出

需要添加的引用:AopSdk

第一步:調用資金凍結接口

        /// <summary>
        /// 線上資金授權凍結接口
        /// 功能:創建支付寶授權訂單並完成資金凍結。適用於線上場景完成資金授權, 例如從商戶APP端拉起支付寶收銀臺完成凍結。
        /// 文檔: https://opendocs.alipay.com/open/20180417160701241302/vo4kv7/
        ///       https://opendocs.alipay.com/apis/api_28/alipay.fund.auth.order.app.freeze
        /// </summary>
        /// <returns></returns>
        public string FreezeOnline()
        {
            string res=string.Empty;
            //接收異步通知數據的地址
            string notifyurl = "xxxxxxxxxxxx";
           
            FreezeRequest req = new FreezeRequest()
            {
                out_order_no = "11111117788",
                out_request_no = System.Guid.NewGuid().ToString("N"),
                order_title = "test",
                amount = 100.00,
                product_code = "PRE_AUTH_ONLINE",
                extra_param = "{\\\"category\\\":\\\"SCENIC_POSTPAY\\\",\\\"serviceId\\\":\\\"2020xxxxxxxxxxxxx\\\"}",
                scene_code = "ONLINE_AUTH_COMMON_SCENE",
                payee_logon_id = "xxxxxxxxx",
                payee_user_id = "xxxxxxxxx"
            };

            try
            {
                IAopClient client = new DefaultAopClient("https://openapi.alipay.com/gateway.do", app_id, merchant_private_key, "json", "1.0", "RSA2", alipay_public_key, "GBK", false);
                AlipayFundAuthOrderAppFreezeRequest request = new AlipayFundAuthOrderAppFreezeRequest();

                request.BizContent = "{" +
                $"\"out_order_no\":\"{req.out_order_no}\"," +
                $"\"out_request_no\":\"{req.out_request_no}\"," +
                $"\"order_title\":\"{req.order_title}\"," +
                $"\"amount\":\"{req.amount.ToString("f2")}\"," +
                $"\"product_code\":\"{req.product_code}\"," +
                $"\"payee_logon_id\":\"{req.payee_logon_id}\"," +
                $"\"payee_user_id\":\"{req.payee_user_id}\"," +
                "\"extra_param\":\"" + req.extra_param + "\"" +
                "}";

                request.SetNotifyUrl(notifyurl);

                AlipayFundAuthOrderAppFreezeResponse response = client.SdkExecute<AlipayFundAuthOrderAppFreezeResponse>(request);

                res = HttpUtility.UrlDecode(response.Body);
            }
            catch (Exception ex)
            {
                res = ex.ToString();
            }

            return res;
        }

這個接口需要注意的是extra_param中的serviceId是必傳,而且調用的是client.SdkExecute(request);這個方法。之前調用client.Excute(request)一直返回錯誤。

第二步:將第一步的的response.Body直接返回給前端,前端收到後調起支付寶讓用戶授權/支付,接收回調數據

        public void Notify(System.Web.HttpContext.Current.Request.Form paras)
        {

            try
            {
               //首先對接收到的數據進行驗籤 這裏沒寫這個邏輯 開發的時候要加上

                string orderId = paras["out_order_no"];

                //operation_type 【FREEZE--資金凍結回調,UNFREEZE,PAY】
                string operation_type = paras["operation_type"];

                //資金預授權明細的狀態 目前支持:   INIT:初始 SUCCESS: 成功 CLOSED:關閉
                string status = paras["status"];

                //這個用戶的支付寶id要保存下,因爲授權轉支付的時候要用到
                string payer_user_id = paras["payer_user_id"];

                    if (operation_type == "FREEZE")
                    {
                        if (status == "INIT")
                        {

                        }
                        if (status == "SUCCESS")
                        {
                            //授權成功
                        }
                        if (status == "CLOSED")
                        {
                            //授權關閉
                        }

                    }

                }
            
            catch (Exception ex)
            {
                 return "error";
            }
            return "success";
        }

第三步:調用授權轉支付接口

        /// <summary>
        /// 文檔:https://opendocs.alipay.com/apis/api_1/alipay.trade.orderinfo.sync
        /// </summary>
        /// <auth_code>支付授權碼</auth_code>
        /// <subject>訂單標題</subject>
        /// <returns></returns>
        public string TradePay()
        {
            string res = string.Empty;

            //接收異步通知的地址
            string notifyurl = "xxxxxxxxxxxxxxx";
            try
            {
                
                IAopClient client = new DefaultAopClient("https://openapi.alipay.com/gateway.do", app_id, merchant_private_key,
                    "json", "1.0", "RSA2", alipay_public_key, "GBK", false);

                var tradePayReqParam = new
                {
                    out_trade_no = "xxxxxxx", // 預授權轉支付商戶訂單號
                    //scene = "bar_code",
                    product_code = "PRE_AUTH_ONLINE",
                    auth_no = "xxxxxxxxxx",
                    subject = "test",
                    buyer_id = "xxxxxxxxxxxx",
                    seller_id = "xxxxxxxxxx",
                    total_amount = "100.00",
                    auth_confirm_mode = "COMPLETE"
                };
                AlipayTradePayRequest request = new AlipayTradePayRequest();
                request.BizContent = "{" +
                $"\"out_trade_no\":\"{tradePayReqParam.out_trade_no}\"," +
                //$"\"scene\":\"{tradePayReqParam.scene}\"," +
                $"\"auth_no\":\"{tradePayReqParam.auth_code}\"," +
                $"\"subject\":\"{tradePayReqParam.subject}\"," +
                $"\"product_code\":\"{tradePayReqParam.product_code}\"," +
                $"\"buyer_id\":\"{tradePayReqParam.buyer_id}\"," +
                $"\"seller_id\":\"{tradePayReqParam.seller_id}\"," +
                $"\"total_amount\":\"{tradePayReqParam.total_amount}\"," +
                $"\"auth_confirm_mode\":\"{tradePayReqParam.auth_confirm_mode}\"" +
                "  }";

                request.SetNotifyUrl(notifyurl);
                AlipayTradePayResponse response = client.Execute(request);

                res = response.Body;
            }
            catch (Exception ex)
            {
                res = ex.Message;
            }

            return res;
        }

第三步注意事項:文檔裏的auth_code字段要改成auth_no ,auth_no在資金凍結接口的異步通知裏取。product_code和buyer_id和seller_id是必傳字段,scene不需要傳。auth_confirm_mode字段必傳,具體傳什麼看文檔。這些都是坑。大家注意。

 

其他的接口和異步通知我就不寫了,大同小異。最後,給對接者一句話:先耐心詳細看文檔  遇到問題及時問客服

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章