C#微信开发之旅(十三):V2订单查询&退款(完结)

订单查询

用处同V3订单查询,直接上代码:

 1         /// <summary>
 2         /// V2订单查询
 3         /// </summary>
 4         public void QueryOrder()
 5         {
 6             string orderNo = string.Empty;
 7
 8             WxPayModel model = WxPayModel.Create(orderNo);
 9             OrderQueryMessage message = WeiXinHelper.OrderQuery(model.CreateOrderQueryPackage());
10         }

生成订单查询json方法:

 1         /// <summary>
 2         /// 生成订单查询Json  (已测试通过)
 3         /// </summary>
 4         /// <returns></returns>
 5         public string CreateOrderQueryPackage()
 6         {
 7             Dictionary<string, string> nativeObj = new Dictionary<string, string>();
 8             if (CheckOrderQueryParameters() == false)
 9             {
10                 throw new SDKRuntimeException("生成package参数缺失!");
11             }
12             nativeObj.Add("appid", AppId);
13             nativeObj.Add("package", GetCftPackage());
14             nativeObj.Add("timestamp", ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000).ToString());
15             nativeObj.Add("app_signature", GetBizSign(nativeObj));
16             nativeObj.Add("sign_method", SignType);
17
18             var entries = nativeObj.Select(d => string.Format("\"{0}\": \"{1}\"", d.Key, d.Value));
19
20             return "{" + string.Join(",", entries.ToArray()) + "}";
21         }

退款

退款操作只是向财付通发出退款通知,成功与否需要查询:

 1         /// <summary>
 2         /// V2退款
 3         /// </summary>
 4         /// <returns>提交退款结果</returns>
 5         public bool OrderRefund()
 6         {
 7             string orderNo = string.Empty;
 8             string transactionId = string.Empty;
 9             string totalFee = string.Empty;
10             string refundNo = string.Empty;
11             string refundFee = string.Empty;
12
13             /*
14              TenpayHelper.Refund()方法中  这两段代码是在  管理员账号的密码默认为111111时使用 ,请根据情况修改
15             reqHandler.setParameter("op_user_id", partnerId); //todo:配置(op_user_id,op_user_passwd)
16             reqHandler.setParameter("op_user_passwd", MD5Util.GetMD5("111111", "GBK"));
17              */
18
19             return TenpayHelper.Refund(WeiXinConst.PartnerId, WeiXinConst.PartnerKey,
20                orderNo, transactionId, totalFee, refundNo, refundFee,
21                WeiXinConst.CertPath, WeiXinConst.CertPwd);
22         }

TenpayHelper.Refund()方法是对V2官方demo再次封装的,相关方法做了一点修改:

 1     /// <summary>
 2     /// V2 接口 退款帮助类
 3     /// </summary>
 4     public class TenpayHelper
 5     {
 6         /// <summary>
 7         /// 申请退款
 8         /// </summary>
 9         /// <param name="partnerId">商户号</param>
10         /// <param name="partnerKey">财付通密钥</param>
11         /// <param name="orderNo">商户订单号</param>
12         /// <param name="transanctionId">微信订单号</param>
13         /// <param name="totalFee">总金额(单位:分)</param>
14         /// <param name="refundNo">退款单号</param>
15         /// <param name="refundFee">退款金额(单位:分)</param>
16         /// <param name="Context">MVC页面请求上下文对象</param>
17         /// <returns></returns>
18         public static bool Refund(string partnerId, string partnerKey, string orderNo,
19             string transanctionId, string totalFee, string refundNo, string refundFee,
20             string certPath, string certPwd)
21         {
22             //商户号
23             string partner = partnerId;
24             //创建请求对象
25             RequestHandler reqHandler = new RequestHandler();
26             //通信对象
27             TenpayHttpClient httpClient = new TenpayHttpClient();
28             //应答对象
29             ClientResponseHandler resHandler = new ClientResponseHandler();
30
31             //-----------------------------
32             //设置请求参数
33             //-----------------------------
34             reqHandler.init();
35             reqHandler.setKey(partnerKey); //财付通密钥
36
37             reqHandler.setGateUrl("https://mch.tenpay.com/refundapi/gateway/refund.xml");
38
39             reqHandler.setParameter("partner", partner);
40             //out_trade_no和transaction_id至少一个必填,同时存在时transaction_id优先
41             if (string.IsNullOrEmpty(transanctionId))
42             {
43                 if (string.IsNullOrEmpty(orderNo))
44                     throw new Exception("订单号不能为空!");
45
46                 reqHandler.setParameter("out_trade_no", orderNo);
47             }
48             else
49             {
50                 reqHandler.setParameter("transaction_id", transanctionId);
51             }
52
53             reqHandler.setParameter("out_refund_no", refundNo); //退款单号
54             reqHandler.setParameter("total_fee", totalFee); //总金额
55             reqHandler.setParameter("refund_fee", refundFee); //退款金额
56             reqHandler.setParameter("op_user_id", partnerId); //todo:配置(op_user_id,op_user_passwd)
57             reqHandler.setParameter("op_user_passwd", MD5Util.GetMD5("111111", "GBK"));
58             reqHandler.setParameter("service_version", "1.1");
59
60             string requestUrl = reqHandler.getRequestURL();
61             httpClient.setCertInfo(certPath, certPwd);
62             //设置请求内容
63             httpClient.setReqContent(requestUrl);
64             //设置超时
65             httpClient.setTimeOut(10);
66
67             string rescontent = "";
68             //后台调用
69             if (httpClient.call())
70             {
71                 //获取结果
72                 rescontent = httpClient.getResContent();
73
74                 resHandler.setKey(partnerKey);
75                 //设置结果参数
76                 resHandler.setContent(rescontent);
77                 //判断签名及结果
78                 if (resHandler.isTenpaySign() && resHandler.getParameter("retcode") == "0")
79                 {
80                     return true;
81                 }
82                 else
83                 {
84                     return false;
85                 }
86             }
87             else
88             {
89                 return false;
90             }
91         }
92     }

结束语:

  C#微信开发之旅是我在博客园首篇随笔系列,写的虎头蛇尾,就先结束了。。。。

  以后会继续坚持写博客,分享工作中总结的微小经验用以记录,也希望能帮到大家!

时间: 2024-10-25 07:02:15

C#微信开发之旅(十三):V2订单查询&退款(完结)的相关文章

C#微信开发之旅(三):AccessToken获取及全局管理

由于AccessToken有效期为2小时,并且接口调用有数量限制,所以开始时选择用WCF做了全局管理(项目中要到AccessToken的地方太多了,支付相关.生成二维码.获取用户信息.菜单操作等等) 下面是AccessToken全局管理的单例类,(原理:通过微信接口获取AccessToken,存储在内存中,当其他项目调用时,会判断是否过期,过期去拿新Token再返回): 1 /// <summary> 2 /// AccessToken类,公众号通过此token 获取相关信息 (单例类) 3

C#微信开发之旅(九):JSAPI支付(V3)(相关代码待补全)

微信开发遇到最复杂的就是支付了,无论V2还是V3.这篇文章将给出全套的V3版本JSAPI支付代码,包括预支付->支付->订单查询->通知->退款,其中前三步已经上线应用,退款只是简单测试了一下,大家要用的话需要谨慎... 一.预支付&支付 实际就是讲订单信息交给微信端,返回给我们一个预支付id(与V2app支付相似),支付时将预支付id交给微信处理.注意:预支付id 需存储,每个out_trade_no(我们自己的订单号)只能对应一个预支付id.代码奉上:(mvc demo

C#微信开发之旅(三):基础类之WeiXinConst

开发过程中需要用的的公众号信息在这里配置,此外需要用到的Url信息无需更改. /// <summary> /// 微信 需要用到的Url.Json常量 /// </summary> public class WeiXinConst { #region Value Const /// <summary> /// 微信开发者 AppId /// </summary> public const string AppId = "你的AppId";

C#微信开发之旅(十一):V2发货接口

用户支付完成后,V2版本微信支付需要调用发货接口,否则微信会告警并且用户也可以进行维权,总之会有灰常多的事情: 1 public void DeliverNotify() 2 { 3 string openId = string.Empty; //买家openid 4 string transactionId = string.Empty;//微信交易单号 5 string orderNo = string.Empty;//我们自己的订单号,文档中的out_trade_no 6 7 8 WxPa

C#微信开发之旅(十):APP预支付及支付参数生成(V2)

App支付流程: 本篇随笔只实现红框内的两个功能:生成预支付Id,生成app支付参数 1 /// <summary> 2 /// App 预支付 3 /// </summary> 4 /// <returns></returns> 5 public ActionResult AppPrePay() 6 { 7 string orderNo = ""; //订单编号,文档中的out_trade_no 8 string description

C#微信开发之旅(十二):V2告警接口&amp;维权接口

告警接口,是微信用来通知我们一样警告信息,可以存储到DB定期查看并解决:维权则是用户主动发起的,需要我们处理.... 1 /// <summary> 2 /// 维权通知 3 /// </summary> 4 /// <returns></returns> 5 public void Notice() 6 { 7 #region 用户新增维权 8 9 /* 10 * <xml> 11 * <OpenId><![CDATA[o0p

C#微信开发之旅(二):基础类之HttpClientHelper

包含通过HttpClient发起get或post请求的方法,所有调用微信接口的操作都通过此类.话不多说,直接上代码: 1 public class HttpClientHelper 2 { 3 /// <summary> 4 /// get请求 5 /// </summary> 6 /// <param name="url"></param> 7 /// <returns></returns> 8 public s

C#微信开发之旅(七):根据经纬度获取地址(百度地图Api)

开发过程中遇到这样的需求,根据用户的地理位置不同,显示不同区域的产品. 这里用到了微信:获取用户地理位置 的功能,(每隔5秒上报 或 进入回话时上报一次),我们根据微信推送过来的经纬度,来转换成实际地址,这里用到的是百度地图Api(要用的话先申请百度ak). PS:微信的这个功能很不稳定,靠它不靠谱,经常不推送...(后来加了手动定位,百度地图Web定位组件 还不错,不是广告!0.0) #region 根据经纬度 获取地址信息 BaiduApi /// <summary> /// 根据经纬度

C#微信开发之旅(六):生成带参数的二维码

主要用来推广并统计数据,当用户扫描带参数二维码时,微信会推送消息到我们的服务器,此时可以根据参数了解到用户是从哪个渠道关注的.话不多少,先来代码: 1 #region 生成二维码 2 3 /// <summary> 4 /// 获取Ticket 5 /// </summary> 6 /// <returns></returns> 7 private static string CreateTicket(string scene_id) 8 { 9 var t