谁谁谁手机那边支付宝支付成功扣钱了,游戏里面却没有充钱,唯有写个补单程序。

首先要查单,查单接口(交易信息查询接口: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 = ;//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; }
}
}

获取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")[].InnerText;
if (queryorder.is_success == "F") return queryorder;
queryorder.sign = element.GetElementsByTagName("sign")[].InnerText;
queryorder.sign_type = element.GetElementsByTagName("sign_type")[].InnerText;
} topM = xmldoc.SelectNodes("alipay/response/trade");
foreach (XmlElement element in topM)
{
queryorder.buyer_email = element.GetElementsByTagName("buyer_email")[].InnerText;
queryorder.buyer_id = element.GetElementsByTagName("buyer_id")[].InnerText;
queryorder.discount = element.GetElementsByTagName("discount")[].InnerText;
queryorder.flag_trade_locked = element.GetElementsByTagName("flag_trade_locked")[].InnerText;
queryorder.gmt_create = element.GetElementsByTagName("gmt_create")[].InnerText;
queryorder.gmt_last_modified_time = element.GetElementsByTagName("gmt_last_modified_time")[].InnerText;
queryorder.gmt_payment = element.GetElementsByTagName("gmt_payment")[].InnerText;
queryorder.is_total_fee_adjust = element.GetElementsByTagName("is_total_fee_adjust")[].InnerText;
queryorder.operator_role = element.GetElementsByTagName("operator_role")[].InnerText;
queryorder.out_trade_no = element.GetElementsByTagName("out_trade_no")[].InnerText;
queryorder.payment_type = element.GetElementsByTagName("payment_type")[].InnerText;
queryorder.price = element.GetElementsByTagName("price")[].InnerText;
queryorder.quantity = element.GetElementsByTagName("quantity")[].InnerText;
queryorder.seller_email = element.GetElementsByTagName("seller_email")[].InnerText;
queryorder.seller_id = element.GetElementsByTagName("seller_id")[].InnerText;
queryorder.subject = element.GetElementsByTagName("subject")[].InnerText;
queryorder.time_out = element.GetElementsByTagName("time_out")[].InnerText;
queryorder.time_out_type = element.GetElementsByTagName("time_out_type")[].InnerText;
queryorder.to_buyer_fee = element.GetElementsByTagName("to_buyer_fee")[].InnerText;
queryorder.to_seller_fee = element.GetElementsByTagName("to_seller_fee")[].InnerText;
queryorder.total_fee = element.GetElementsByTagName("total_fee")[].InnerText;
queryorder.trade_no = element.GetElementsByTagName("trade_no")[].InnerText;
queryorder.trade_status = element.GetElementsByTagName("trade_status")[].InnerText;
queryorder.use_coupon = element.GetElementsByTagName("use_coupon")[].InnerText;
}
return queryorder;
}
}

然后可以根据订单状态写自己的业务逻辑了:

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

c# 支付宝查单补单的更多相关文章

  1. Kafka 单节点单Kafka Broker集群

    下载与安装 从 http://www.apache.org/dist/kafka/ 下载最新版本的 kafka,这里使用的是 kafka_2.12-0.10.2.1.tgz $ tar zxvf ka ...

  2. SNF开发平台WinForm之二-开发-单表表单管理页面-SNF快速开发平台3.3-Spring.Net.Framework

    2.1运行效果: 2.2开发实现: 2.2.1 这个开发与第一个开发操作步骤是一致的,不同之处就是在生成完代码之后,留下如下圈红程序,其它删除. 第一个开发地址:开发-单表表格编辑管理页面 http: ...

  3. Vijos 1006 晴天小猪历险记之Hill 单源单汇最短路

    背景 在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结-- 不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物.所以晴天小猪自告奋勇 ...

  4. 《多线程操作之生产者消费者》(单生产单消费&多生产多消费)

    说明1:假设有一个放商品的盘子(此盘子只能放下一个商品).生产者每次生产一个商品之后,放到这个盘子里,然后唤醒消费者来消费这个面包.消费者消费完这个商品之后,就唤醒生产者生产下一个商品.前提是,只有盘 ...

  5. html5-增强的表单-表单的重写

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  6. flask 单个页面多个表单(单视图处理、多视图处理)

    单个页面多个表单 除了在单个表单上实现多个提交按钮,有时还需要在单个页面上创建多个表单.比如,在程序的主页上同时添加登录和注册表单.当在同一个页面上添加多个表单时,我们需要解决的问题是在视图函数中判断 ...

  7. 雷林鹏分享:jQuery EasyUI 表单 - 表单验证

    jQuery EasyUI 表单 - 表单验证 本教程将向您展示如何验证一个表单.easyui 框架提供一个 validatebox 插件来验证一个表单.在本教程中,我们将创建一个联系表单,并应用 v ...

  8. springboot2.0+websocket集成【群发消息+单对单】(二)

    https://blog.csdn.net/qq_21019419/article/details/82804921 版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上 ...

  9. 用python selenium 单窗口单IP刷网站流量脚本

    近期有朋友说需要增加自己网站的流量,故用python写了一个简单的脚本,配合IP池或者动态IP都可以刷,当然最爽的是单窗口单IP. 说明 作弊可耻! 环境 python3.8 + selenium + ...

随机推荐

  1. matlab 非平稳变化时域分析

    对于非平稳信号,由于傅立叶变换核心函数-正弦函数具有无限性,因此选用短时窗来分析局域信号: 需要注意的时,选取完滑动的时间窗一般是中心对称而且为奇数,这时被分析的时间点正好是滑动窗的中点. 因此,时域 ...

  2. web前端基础篇②

    1.要默认选择在radio或checkbox后加checked 2.想实现单选在radio后加上name 两个命名一样即可出现排斥 3.自动聚焦 autofocus readonly只读 4.plac ...

  3. <s:textfield>标签

    中的value=“”还是挺有用的,比如说更新之前,根据需要更新的用户(地址.商品等等等等)的id,在updateInput方法中,先做一些准备,根据这个id去数据库取属性出来,放到ActionCont ...

  4. 设置类型Double小数点位数

    Double amount = 100;DecimalFormat dcmFmt = new DecimalFormat("0.0000"); String amountStr = ...

  5. Android 学习第4课,一些小知识

    java语言的注释有如下3种: 1. // 2./* 注释内容 */ 3./**     注释内容    */       这种叫文档注释,这种注释常被javaDoc文档工具读取作为 JavaDoc文 ...

  6. IOS7 ~ Xcode5 制作 framework

    一.Framework 简介(Introduction to Framework Programming Guide) Mac OS X 扩展了 framework 的功能,让我们能够利用它来共享代码 ...

  7. Scalding初探之一:基于Scala的Hadoop利器

    把你从写繁琐的Map-reduce Job中解放出来,写分布式跟写本地程序没两样,Scala真真代表着先进生产力的方向啊. 好的,今天开始直播基于Scala的Scalding啦,循序渐进地看以下页面: ...

  8. C++中的初始化

    C++中的RAII机制指明”对象创建时通过构造函数进行初始化,析构时通过析构函数释放资源”,但实际中因类无构造函数时编译器将自动合成一个默认构造函数,该构造函数只服务于自身编译器构造需要而不负责对象成 ...

  9. Codeforces Round #161 (Div. 2)

    A. Beautiful Matrix 即相当于求1到中心位置\((2,2)\)的曼哈顿距离. B. Squares 排序,取倒数第\(k\)个即可. C. Circle of Numbers 固定\ ...

  10. OpenMP对于嵌套循环应该添加多少个parallel for 分类: OpenMP C/C++ Linux 2015-04-27 14:48 53人阅读 评论(0) 收藏

    一个原则是:应该尽量少的使用parallelfor, 因为parallel for也需要时间开销.即: (1)如果外层循环次数远远小于内层循环次数,内层循环较多时,将parallel for加在内层循 ...