訂單查詢
用處同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#微信開發之旅是我在博客園首篇隨筆系列,寫的虎頭蛇尾,就先結束了。。。。
以后會繼續堅持寫博客,分享工作中總結的微小經驗用以記錄,也希望能幫到大家!