/// <summary> /// 申请退款(V3接口) /// </summary> /// <param name="postData">请求参数</param> /// <param name="certPath">证书路径</param> /// <param name="certPwd">证书密码</param> public static bool Refund(string postData, string certPath, string certPwd) { string url = WeiXinConst.WeiXin_Pay_UnifiedOrderRefundUrl; RefundMessage message = RefundHelper.PostXmlResponse <RefundMessage>(url, postData, certPath, certPwd); return(message.Success); }
public void SendRefundExample() { // Instantiate the client to use // NOTE: The api key can be found on top of the documentation page var smsClient = new FacadeSmsClient( hostRootUrl: "[HOST-ROOT-URL]", apiKey: "INSERT APIKEY"); // Create a list of messages to be sent var messagesToSend = new List <ISmsMessage>(); // Add a refund message that points to an existing overcharged message var message = new RefundMessage(messageIdToRefund: "MessageId123", messageText: "We have refunded the 100 DKK previously charged from your phone bill"); messagesToSend.Add(message); // Send the messages and evaluate the response try { var response = smsClient.SendMessages( messages: messagesToSend, messageStatusCallbackUrl: "http://mywebsite.com/example/messagestatus"); } catch (SendMessageException smex) { // Catch exception to see error Console.WriteLine(smex.Message); } }
public void Build_RefundMessages_Test() { var builder = new SendMessagesRequestBuilder(); var refund1 = new RefundMessage(messageIdToRefund: "RefundId1", messageText: "Refund & < > text 1", messageId: "MessageId123"); var refund2 = new RefundMessage(messageIdToRefund: "RefundId2", messageText: "Refund text 2"); var result = builder.BuildPostXmlData(new List <ISmsMessage>() { refund1, refund2 }, "apiKey", "http://someUrl.callback.inmobile.dk/unittest/messagestatus"); var expectedOutput = $@"<request source=""Official SendMessages Client {ClientUtils.VersionNumber}""> <authentication apikey=""apiKey"" /> <data> <statuscallbackurl>http://someUrl.callback.inmobile.dk/unittest/messagestatus</statuscallbackurl> <refundmessage messageidtorefund=""RefundId1"" messageid=""MessageId123""> <text>Refund & < > text 1</text> </refundmessage> <refundmessage messageidtorefund=""RefundId2""> <text>Refund text 2</text> </refundmessage> </data> </request>"; AssertEqualXml(expectedOutput, result); }
/// <summary> /// 确认退款 /// </summary> /// <param name="refundParam"></param> /// <param name="certPath"></param> /// <param name="certPwd"></param> /// <param name="paykey"></param> /// <param name="return_msg"></param> /// <returns></returns> public StateCode WeChatConfirmRefund(RefundPay refundParam, long order_id, string certPath, string certPwd, string paykey, out string return_msg) { using (ISession s = SessionFactory.Instance.CreateSession()) { return_msg = string.Empty; try { //回调 RefundMessage rmessage = WeChatPayHelper.CallRefund(refundParam, certPath, certPwd, paykey); if (rmessage.return_code.Equals("FAIL", StringComparison.OrdinalIgnoreCase)) { return_msg = rmessage.return_msg; return(StateCode.State_500); } else if (rmessage.result_code.Equals("FAIL", StringComparison.OrdinalIgnoreCase)) { return_msg = rmessage.err_code + " " + rmessage.err_code_des; return(StateCode.State_500); } //开启事务 s.StartTransaction(); //更新订单状态 s.ExcuteUpdate("update tb_odr_order set refund_status = @0,status = @1 where id = @2 ", OrderRefundStatus.Pass, OrderStatus.Close, order_id); //更新退款单状态 s.ExcuteUpdate("update tb_odr_refund set status = @0 where order_serial_no = @1 ", OrderRefundStatus.Pass, refundParam.out_trade_no); //提交事务 s.Commit(); return(StateCode.State_200); } catch (Exception ex) { return_msg = ex.ToString(); s.RollBack(); return(StateCode.State_500); } } }
/// <summary> /// 申请退款(V3接口) /// </summary> /// <param name="postData">请求参数</param> /// <param name="certPath">证书路径</param> /// <param name="certPwd">证书密码</param> public static bool Refund(string comapnyId, string transaction_Id, string out_trade_no, string total_fee, string refund_fee, string refundNo, string certpath) { TxtLogServices.WriteTxtLogEx("WeiXin_Request_Refund", "transaction_Id:{0};out_trade_no:{1};total_fee:{2};refund_fee:{3};refundNo:{4}", transaction_Id, out_trade_no, total_fee, refund_fee, refundNo); UnifiedPayModel model = UnifiedPayModel.CreateUnifiedModel(comapnyId); string postData = model.CreateOrderRefundXml(out_trade_no, transaction_Id, total_fee, refundNo, refund_fee); TxtLogServices.WriteTxtLogEx("WeiXin_Request_Refund", "postData xml:{0}", postData); WX_ApiConfig config = WXApiConfigServices.QueryWXApiConfig(comapnyId); TxtLogServices.WriteTxtLogEx("WeiXin_Request_Refund", "config:{0}", config == null?"is null":"is not null"); if (config == null || string.IsNullOrWhiteSpace(config.CertPath) || string.IsNullOrWhiteSpace(config.CertPwd)) { throw new MyException("获取支付配置失败"); } string path = string.Format("{0}{1}", certpath, config.CertPath.TrimStart('/')); string url = WeiXinPayConst.WeiXin_Pay_UnifiedOrderRefundUrl; RefundMessage message = PostXmlResponse <RefundMessage>(url, postData, path, config.CertPwd); TxtLogServices.WriteTxtLogEx("WeiXin_Request_Refund", "OrderId:{0};return Xml:{1}", out_trade_no, message.ToXmlString()); return(message.Success); }