/// <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);
        }
Exemple #2
0
        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);
            }
        }
Exemple #3
0
        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 &amp; &lt; &gt; 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);
                }
            }
        }
Exemple #5
0
        /// <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);
        }