c# 支付寶查單補單


誰誰誰手機那邊支付寶支付成功扣錢了,游戲里面卻沒有充錢,唯有寫個補單程序。

首先要查單,查單接口(交易信息查詢接口:https://mapi.alipay.com/gateway.do),服務名稱:single_trade_query。

這個接口權限要到支付寶聯系客服開通

用4點積分去CSDN下載了個demo,我共享吧:https://yunpan.cn/cqavWFY3Tccua  訪問密碼 2860

demo是web形式的,我要的是winfrom效果,在服務器每隔幾分鍾就運行一次,實現自動補單效果。

主要代碼:

            DataControl gData = new DataControl();
            try
            {
                string url = "https://mapi.alipay.com/gateway.do?";
                

                //查詢未付款的支付寶訂單
                DataTable dt = gData.GetDataTable("select .... from ....");
                string post_data = "";
                string requestData = "";

                foreach (DataRow r in dt.Rows)
                {
                    //把請求參數打包成數組
                    SortedDictionary<string, string> sParaTemp = new SortedDictionary<string, string>();
                    sParaTemp.Add("partner", Config.Partner);
                    sParaTemp.Add("_input_charset", Config.Input_charset.ToLower());
                    sParaTemp.Add("service", "single_trade_query");
                    sParaTemp.Add("trade_no", "");
                    sParaTemp.Add("out_trade_no", r["OrderID"].ToString());
                    post_data = AlipaySubmit.BuildRequest(sParaTemp);

                    requestData = gData.CallWebApi(url + post_data);

                    QueryOrder queryorder = new QueryOrder();
                    queryorder = InsQueryOrder(requestData);

                    if (queryorder.is_success == "T")
                    {
                        if (queryorder.trade_status == "TRADE_SUCCESS")
                        {
                            WriteReturnZFBDetail(queryorder);
                            FilliedOnline(queryorder.out_trade_no);
                        }
                    }
                }

                
            }
            catch(Exception ex) { }

post_data是api需要的參數,得到的效果是這樣的:

service=single_trade_query&sign=簽名&partner=支付寶合作身份者ID&out_trade_no=商戶訂單號&sign_type=MD5

可以直接瀏覽器這樣訪問:

https://mapi.alipay.com/gateway.do?service=single_trade_query&sign=簽名&partner=支付寶合作身份者ID&out_trade_no=商戶訂單號&sign_type=MD5

結果:

前提是准備好了自己的相關數據。

requestData = gData.CallWebApi(url + post_data);

這個函數可以得到API返回來的數據,該API返回數據格式是xml,數據是這樣的:

<?xml version="1.0" encoding="utf-8"?>
<alipay>
    <is_success>T</is_success>
    <request>
        <param name="trade_no">2010073000030344</param>
        <param name="service">single_trade_query</param>
        <param name="partner">2088002007018916</param>
    </request>
    <response>
        <trade>
            <body>合同催款通知</body>
            <buyer_email>ltrade008@alitest.com</buyer_email>
            <buyer_id>2088102002723445</buyer_id>
            <discount>0.00</discount>
            <gmt_create>2010-07-30 12:26:33</gmt_create>
            <gmt_last_modified_time>2010-07-30 12:30:29
            </gmt_last_modified_time>
            <gmt_payment>2010-07-30 12:30:29</gmt_payment>
            <is_total_fee_adjust>F</is_total_fee_adjust>
            <out_trade_no>1280463992953</out_trade_no>
            <payment_type>1</payment_type>
            <price>1.00</price>
            <quantity>1</quantity>
            <seller_email>chao.chenc1@alipay.com</seller_email>
            <seller_id>2088002007018916</seller_id>
            <subject>合同催款通知</subject>
            <total_fee>1.00</total_fee>
            <trade_no>2010073000030344</trade_no>
            <trade_status>TRADE_FINISHED</trade_status>
            <use_coupon>F</use_coupon>
        </trade>
    </response>
    <sign>56ae9c3286886f76e57e0993625c71fe</sign>
    <sign_type>MD5</sign_type>
</alipay>        

訪問接口並返回接口數據的函數CallWebApi:

    public string CallWebApi(string url)
    {
        string html = "";
        try
        {
            HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
            req.ContentType = "multipart/form-data";
            req.Accept = "*/*";
            req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)";
            req.Timeout = 30000;//30秒連接不成功就中斷 
            req.Method = "GET";

            HttpWebResponse response = req.GetResponse() as HttpWebResponse;
            using (StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
            {
                html = sr.ReadToEnd();
            }
        }
        catch { }
        return html;
    }

QueryOrder類:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;

namespace AlipayCheck
{
    [DataContract]
    public class QueryOrder
    {
        /// <summary>
        /// 是否成功,T代表成功,F代表失敗
        /// </summary>
        public string is_success { get; set; }

        /// <summary>
        /// 簽名
        /// </summary>
        public string sign { get; set; }

        /// <summary>
        /// 簽名方式只支持DSA、RSA、MD5
        /// </summary>
        public string sign_type { get; set; }

        /// <summary>
        /// 只有當查詢交易失敗后,才返回錯誤代碼
        /// </summary>
        public string error { get; set; }

        /// <summary>
        /// 買家支付寶賬號
        /// </summary>
        public string buyer_email { get; set; }

        /// <summary>
        /// 買家支付寶賬號對應的支付寶唯一用戶號
        /// </summary>
        public string buyer_id { get; set; }

        /// <summary>
        /// 交易狀態
        /// </summary>
        public string trade_status { get; set; }

        /// <summary>
        /// 交易金額是否調整過
        /// </summary>
        public string is_total_fee_adjust { get; set; }

        /// <summary>
        /// 商戶網站唯一訂單號
        /// </summary>
        public string out_trade_no { get; set; }

        /// <summary>
        /// 支付寶交易號
        /// </summary>
        public string trade_no { get; set; }

        /// <summary>
        /// 商品名稱
        /// </summary>
        public string subject { get; set; }

        /// <summary>
        /// 交易凍結狀態
        /// </summary>
        public string flag_trade_locked { get; set; }

        /// <summary>
        /// 商品描述
        /// </summary>
        public string body { get; set; }

        /// <summary>
        /// 交易創建時間
        /// </summary>
        public string gmt_create { get; set; }

        /// <summary>
        /// 賣家的支付寶賬號
        /// </summary>
        public string seller_email { get; set; }

        /// <summary>
        /// 賣家支付寶賬號對應的支付寶唯一用戶號
        /// </summary>
        public string seller_id { get; set; }

        /// <summary>
        /// 交易總金額
        /// </summary>
        public string total_fee { get; set; }

        /// <summary>
        /// 商品單價
        /// </summary>
        public string price { get; set; }

        /// <summary>
        /// 購買數量
        /// </summary>
        public string quantity { get; set; }

        /// <summary>
        /// 郵費
        /// </summary>
        public string logistics_fee { get; set; }

        /// <summary>
        /// 紅包折扣
        /// </summary>
        public string coupon_discount { get; set; }

        /// <summary>
        /// 是否使用過紅包
        /// </summary>
        public string use_coupon { get; set; }

        /// <summary>
        /// 折扣
        /// </summary>
        public string discount { get; set; }

        /// <summary>
        /// 退款狀態
        /// </summary>
        public string refund_status { get; set; }

        /// <summary>
        /// 物流狀態
        /// </summary>
        public string logistics_status { get; set; }

        /// <summary>
        /// 交易附加狀態
        /// </summary>
        public string additional_trade_status { get; set; }

        /// <summary>
        /// 交易最近一次修改時間
        /// </summary>
        public string gmt_last_modified_time { get; set; }

        /// <summary>
        /// 付款時間
        /// </summary>
        public string gmt_payment { get; set; }

        /// <summary>
        /// 賣家發貨時間
        /// </summary>
        public string gmt_send_goods { get; set; }

        /// <summary>
        /// 退款時間
        /// </summary>
        public string gmt_refund { get; set; }

        /// <summary>
        /// 主超時時間
        /// </summary>
        public string time_out { get; set; }

        /// <summary>
        /// 交易關閉時間,只有為TRADE_CLOSE狀態的交易才存在此時間
        /// </summary>
        public string gmt_close { get; set; }

        /// <summary>
        /// 物流狀態更新時間
        /// </summary>
        public string gmt_logistics_modify { get; set; }

        /// <summary>
        /// 主超時間類型
        /// </summary>
        public string time_out_type { get; set; }

        /// <summary>
        /// 退款金額
        /// </summary>
        public string refund_fee { get; set; }

        /// <summary>
        /// 退款流程
        /// </summary>
        public string refund_flow_type { get; set; }

        /// <summary>
        /// 退款唯一標識號
        /// </summary>
        public string refund_id { get; set; }

        /// <summary>
        /// 退現金金額
        /// </summary>
        public string refund_cash_fee { get; set; }

        /// <summary>
        /// 退紅包金額
        /// </summary>
        public string refund_coupon_fee { get; set; }

        /// <summary>
        /// 退積分金額
        /// </summary>
        public string refund_agent_pay_fee { get; set; }

        /// <summary>
        /// 使用紅包的金額
        /// </summary>
        public string coupon_used_fee { get; set; }

        /// <summary>
        /// 累計的已經退款金額
        /// </summary>
        public string to_buyer_fee { get; set; }

        /// <summary>
        /// 累計的已打款給買家的金額
        /// </summary>
        public string to_seller_fee { get; set; }

        /// <summary>
        /// 資金單據列表,xml格式,由一個或多個FundBillDetail標簽組成。
        /// </summary>
        public string fund_bill_list { get; set; }

        /// <summary>
        /// 收款類型
        /// </summary>
        public string payment_type { get; set; }

        /// <summary>
        /// 交易的創建人角色
        /// </summary>
        public string operator_role { get; set; }

        /// <summary>
        /// 接口類型
        /// </summary>
        public string service { get; set; }
    }
}
View Code

獲取xml數據塞入queryorder類:

        private static QueryOrder InsQueryOrder(string requestData)
        {
            QueryOrder queryorder = new QueryOrder();
            XmlDocument xmldoc = new XmlDocument();
            xmldoc.LoadXml(requestData);

            //獲取節點列表  
            queryorder.service = "single_trade_query";

            XmlNodeList topM = xmldoc.SelectNodes("alipay");
            foreach (XmlElement element in topM)
            {
                queryorder.is_success = element.GetElementsByTagName("is_success")[0].InnerText;
                if (queryorder.is_success == "F") return queryorder;
                queryorder.sign = element.GetElementsByTagName("sign")[0].InnerText;
                queryorder.sign_type = element.GetElementsByTagName("sign_type")[0].InnerText;
            }

            topM = xmldoc.SelectNodes("alipay/response/trade");
            foreach (XmlElement element in topM)
            {
                queryorder.buyer_email = element.GetElementsByTagName("buyer_email")[0].InnerText;
                queryorder.buyer_id = element.GetElementsByTagName("buyer_id")[0].InnerText;
                queryorder.discount = element.GetElementsByTagName("discount")[0].InnerText;
                queryorder.flag_trade_locked = element.GetElementsByTagName("flag_trade_locked")[0].InnerText;
                queryorder.gmt_create = element.GetElementsByTagName("gmt_create")[0].InnerText;
                queryorder.gmt_last_modified_time = element.GetElementsByTagName("gmt_last_modified_time")[0].InnerText;
                queryorder.gmt_payment = element.GetElementsByTagName("gmt_payment")[0].InnerText;
                queryorder.is_total_fee_adjust = element.GetElementsByTagName("is_total_fee_adjust")[0].InnerText;
                queryorder.operator_role = element.GetElementsByTagName("operator_role")[0].InnerText;
                queryorder.out_trade_no = element.GetElementsByTagName("out_trade_no")[0].InnerText;
                queryorder.payment_type = element.GetElementsByTagName("payment_type")[0].InnerText;
                queryorder.price = element.GetElementsByTagName("price")[0].InnerText;
                queryorder.quantity = element.GetElementsByTagName("quantity")[0].InnerText;
                queryorder.seller_email = element.GetElementsByTagName("seller_email")[0].InnerText;
                queryorder.seller_id = element.GetElementsByTagName("seller_id")[0].InnerText;
                queryorder.subject = element.GetElementsByTagName("subject")[0].InnerText;
                queryorder.time_out = element.GetElementsByTagName("time_out")[0].InnerText;
                queryorder.time_out_type = element.GetElementsByTagName("time_out_type")[0].InnerText;
                queryorder.to_buyer_fee = element.GetElementsByTagName("to_buyer_fee")[0].InnerText;
                queryorder.to_seller_fee = element.GetElementsByTagName("to_seller_fee")[0].InnerText;
                queryorder.total_fee = element.GetElementsByTagName("total_fee")[0].InnerText;
                queryorder.trade_no = element.GetElementsByTagName("trade_no")[0].InnerText;
                queryorder.trade_status = element.GetElementsByTagName("trade_status")[0].InnerText;
                queryorder.use_coupon = element.GetElementsByTagName("use_coupon")[0].InnerText;
            } 
            return queryorder;
        }
    }

然后可以根據訂單狀態寫自己的業務邏輯了:

                    if (queryorder.is_success == "T")
                    {
                        if (queryorder.trade_status == "TRADE_SUCCESS")
                        {
                            WriteReturnZFBDetail(queryorder);
                            FilliedOnline(queryorder.out_trade_no);
                        }
                    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM