zhangyang пре 5 година
родитељ
комит
17df07d8b2

BIN
bin/Win32/Debug/zhipuzi_pay_plugin/music/refund_fail.wav


BIN
bin/Win32/Debug/zhipuzi_pay_plugin/music/refund_query.wav


BIN
bin/Win32/Debug/zhipuzi_pay_plugin/music/refund_success.wav


+ 3 - 3
bin/Win32/Debug/zhipuzi_pay_plugin/skin/tuikuan_wnd.xml

@@ -52,11 +52,11 @@
 				<Control></Control>
 			</HorizontalLayout>
 			
-			<Label height="40" padding="0,10,0,10" name="tuikuan_paying_money" text="款金额:" font="3" textcolor="0xFF3CB371" align="center"></Label>
+			<Label height="40" padding="0,10,0,10" name="tuikuan_paying_money" text="退款金额:" font="3" textcolor="0xFF3CB371" align="center"></Label>
 			
-			<Label height="32" padding="0,10,0,10" name="tuikuan_paying_status" text="请求支付中..." font="2" textcolor="0xFF3CB371" align="center"></Label>
+			<Label height="32" padding="0,10,0,10" name="tuikuan_paying_status" text="退款状态查询,请稍后..." font="2" textcolor="0xFF3CB371" align="center"></Label>
 			
-			<Label height="60" padding="20,30,20,0" name="tuikuan_paying_attention" text="如果用户没有支付成功,则请确认客户不再进行支付时再关闭此窗口,按【Esc】取消本次支付" font="2" textcolor="0xFF808080" multiline="true" align="center" />
+			<Label height="60" padding="20,30,20,0" name="tuikuan_paying_attention" text="" font="2" textcolor="0xFF808080" multiline="true" align="center" />
 		</VerticalLayout>
 		
 		<VerticalLayout name="tuikuan_pay_success_layout" visible="false">

BIN
lib/debug/zpzDll.lib


BIN
res/music/refund_fail.wav


BIN
res/music/refund_query.wav


BIN
res/music/refund_success.wav


+ 1 - 0
zhipuzi_pay_plugin/helper/define.h

@@ -23,6 +23,7 @@
 
 #define WM_TUIKUAN_STATUS_SUCCESS 10013
 #define WM_TUIKUAN_STATUS_FAIL 10014
+#define WM_TUIKUAN_STATUS_NEEDPASSWORD 10015
 
 #define WM_HOOK_MESSAGE 12222
 #define WM_WATCH_WND_UPDATE 12223

+ 8 - 9
zhipuzi_pay_plugin/network/CZhipuziHttpClient.cpp

@@ -12,15 +12,15 @@ CZhipuziHttpClient::CZhipuziHttpClient()
 
 	if (m_env == DEV)
 	{
-		m_pingtai_url = "https://pf-api-dev.zhipuzi.com/pos";
+		m_pingtai_url = "https://pf-api-dev3.zhipuzi.com/seller";
 	}
 	else if (m_env == TEST)
 	{
-		m_pingtai_url = "https://pf-api-test.zhipuzi.com/pos";
+		m_pingtai_url = "https://pf-api-test.zhipuzi.com/seller";
 	}
 	else if (m_env == RELEASE)
 	{
-		m_pingtai_url = "https://pf-api.zhipuzi.com/pos";
+		m_pingtai_url = "https://pf-api.zhipuzi.com/seller";
 	}
 }
 
@@ -40,7 +40,7 @@ bool CZhipuziHttpClient::Login(std::string& errmsg)
     std::map<string, string> params;
 
     std::string response;
-    bool ret = m_client.RequestPingtai("/userlogin/userlogin", params, response);
+    bool ret = m_client.RequestPingtaiNew("/login/login", params, response);
 
     if(!ret)
     {
@@ -105,20 +105,20 @@ bool CZhipuziHttpClient::Login(std::string& errmsg)
 	{
 		if (m_client.m_env == RELEASE)
 		{
-			m_client.m_yewu_url = "https://cyapi.zhipuzi.com/pos";
+			m_client.m_yewu_url = "https://cyapi.zhipuzi.com/seller";
 		}
 		else if (m_client.m_env == TEST)
 		{
-			m_client.m_yewu_url = "https://cyapi-test.zhipuzi.com/pos";
+			m_client.m_yewu_url = "https://cyapi-test.zhipuzi.com/seller";
 		}
 		else if (m_client.m_env == DEV)
 		{
-			m_client.m_yewu_url = "https://cyapi-dev.zhipuzi.com/pos";
+			m_client.m_yewu_url = "https://cyapi-dev3.zhipuzi.com/seller";
 		}
 	}
 	else
 	{
-		m_client.m_yewu_url = "https://lsapi.zhipuzi.com/pos";
+		m_client.m_yewu_url = "https://lsapi.zhipuzi.com/seller";
 	}
 
 	rapidjson::Value& v_lwm_sess_token = v_data["lwm_sess_token"];
@@ -353,7 +353,6 @@ bool CZhipuziHttpClient::RequestPingtaiNew(std::string url, std::map<string, str
 	std::string open_secret = "#repast!@#AfAS#@!";
 
 	//先添加默认参数,用于计算签名
-	params["machinecode"] = "a68ceb1719803c2b";
 	params["username"] = CLewaimaiString::UrlEncode(m_client.m_username);
 	params["password"] = md5(m_client.m_password);
 	params["lwm_appid"] = lwm_appid;

+ 1 - 1
zhipuzi_pay_plugin/network/CZhipuziHttpClient.h

@@ -41,5 +41,5 @@ public:
 
 	std::string m_shopname;
 
-	Env m_env = RELEASE;
+	Env m_env = DEV;
 };

+ 9 - 10
zhipuzi_pay_plugin/wnd/CShoukuanWnd.cpp

@@ -579,15 +579,14 @@ void CShoukuanWnd::HandleShoukuan()
 	params["order_no"] = CRandomHelper::GetRandString(20);
 	m_order_no = params["order_no"];
 
-	params["yingshou_value"] = CLewaimaiString::UnicodeToUTF8(m_money);
-	params["shishou_value"] = CLewaimaiString::UnicodeToUTF8(m_money);
+	params["value"] = CLewaimaiString::UnicodeToUTF8(m_money);
 	params["zhaoling_value"] = to_string(0);
 	params["zhifu_type"] = to_string(7);
 	params["zhifu_code"] = CLewaimaiString::UnicodeToUTF8(m_fukuanma);
 
 	std::string response;
 
-	std::string url = "/shouyin/sendorder";
+	std::string url = "/saomashoukuan/sendorder";
 	CZhipuziHttpClient::Request(url.c_str(), params, response);
 
 	rapidjson::Document document;
@@ -638,7 +637,7 @@ void CShoukuanWnd::HandleShoukuan()
 	{
 		m_shoukuan_status = 2;
 
-		m_trade_no = data["trade_no"].GetString();
+		m_out_trade_no = data["out_trade_no"].GetString();
 
 		//需要查询支付状态
 		SendMessage(WM_SHOUKUAN_STATUS_NEEDPASSWORD, 0, 0);
@@ -649,13 +648,13 @@ void CShoukuanWnd::HandleShoukuanPassword()
 {
 	std::map<string, string> params;
 
-	params["trade_no"] = m_trade_no;
+	params["out_trade_no"] = m_out_trade_no;
 
 	while (m_shoukuan_status == 2)
 	{
 		std::string response;
 
-		std::string url = "/shouyin/queryorderstatus";
+		std::string url = "/saomashoukuan/queryorderstatus";
 		CZhipuziHttpClient::Request(url.c_str(), params, response);
 
 		rapidjson::Document document;
@@ -695,12 +694,12 @@ void CShoukuanWnd::HandleShoukuanPassword()
 
 			break;
 		}
-		else if (s_status == "real_fail")
+		else if (s_status == "closed")
 		{
 			//表示顾客那边出问题,已经失败了
 			m_shoukuan_status = 4;
 
-			m_fail_message = data["message"].GetString();
+			m_fail_message = "顾客取消支付,请重新扫码收款";
 
 			SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
 		}
@@ -723,11 +722,11 @@ void CShoukuanWnd::HandleCancelShoukuan()
 {
 	std::map<string, string> params;
 
-	params["trade_no"] = m_trade_no;
+	params["out_trade_no"] = m_out_trade_no;
 
 	std::string response;
 
-	std::string url = "/shouyin/closeorder";
+	std::string url = "saomashoukuan/closeorder";
 	CZhipuziHttpClient::Request(url.c_str(), params, response);
 
 	rapidjson::Document document;

+ 2 - 2
zhipuzi_pay_plugin/wnd/CShoukuanWnd.h

@@ -91,7 +91,7 @@ public:
 	int m_fukuanma_type; //付款码类型 1:微信支付 2:支付宝 3:其他的
 
 	std::string m_order_no;
-	std::string m_trade_no;
+	std::string m_out_trade_no;
 
 	//收款状态 0:未开始 1:请求发给服务器了,但是暂时还没得到反馈 2:查询密码中 3:成功 4:失败 5:正在取消支付
 	int m_shoukuan_status = 0;
@@ -99,6 +99,6 @@ public:
 	std::string m_fail_message;
 
 	//窗口关闭的定时器时间
-	int m_timer_now = 3;
+	int m_timer_now = 4;
 };
 

+ 128 - 7
zhipuzi_pay_plugin/wnd/CTuikuanWnd.cpp

@@ -232,6 +232,15 @@ LRESULT CTuikuanWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
 	case WM_MOUSEHOVER:
 		lRes = OnMouseMove(uMsg, wParam, lParam, bHandled);
 		break;
+	case WM_TUIKUAN_STATUS_NEEDPASSWORD:
+		lRes = OnTuikuanNeedPassword(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_TUIKUAN_STATUS_SUCCESS:
+		lRes = OnTuikuanSuccess(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_TUIKUAN_STATUS_FAIL:
+		lRes = OnTuikuanFail(uMsg, wParam, lParam, bHandled);
+		break;
 	case WM_TIMER:
 		lRes = OnTimer(uMsg, wParam, lParam, bHandled);
 		break;
@@ -350,9 +359,24 @@ void CTuikuanWnd::UpdateFocus()
 	}
 }
 
+LRESULT CTuikuanWnd::OnTuikuanNeedPassword(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	wstring path = CSystem::GetProgramDir() + L"\\music\\refund_query.wav";
+	PlaySound(path.c_str(), NULL, SND_FILENAME | SND_ASYNC);
+
+	CLabelUI* pFukuanEdit = static_cast<CLabelUI*>(m_pm.FindControl(_T("tuikuan_paying_status")));
+	pFukuanEdit->SetText(L"退款结果查询中...");
+
+	//需要用户输入密码,开始查询状态
+	std::thread(&CTuikuanWnd::HandleTuikuanPassword, this).detach();
+
+	bHandled = TRUE;
+	return 0;
+}
+
 LRESULT CTuikuanWnd::OnTuikuanSuccess(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
 {
-	wstring path = CSystem::GetProgramDir() + L"\\music\\pay_success.wav";
+	wstring path = CSystem::GetProgramDir() + L"\\music\\refund_success.wav";
 	PlaySound(path.c_str(), NULL, SND_FILENAME | SND_ASYNC);
 
 	CVerticalLayoutUI* paying_layout = static_cast<CVerticalLayoutUI*>(m_pm.FindControl(_T("tuikuan_paying_layout")));
@@ -386,7 +410,7 @@ LRESULT CTuikuanWnd::OnTuikuanSuccess(UINT uMsg, WPARAM wParam, LPARAM lParam, B
 
 LRESULT CTuikuanWnd::OnTuikuanFail(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
 {
-	wstring path = CSystem::GetProgramDir() + L"\\music\\pay_fail.wav";
+	wstring path = CSystem::GetProgramDir() + L"\\music\\refund_fail.wav";
 	PlaySound(path.c_str(), NULL, SND_FILENAME | SND_ASYNC);
 
 	CVerticalLayoutUI* paying_layout = static_cast<CVerticalLayoutUI*>(m_pm.FindControl(_T("tuikuan_paying_layout")));
@@ -482,11 +506,12 @@ void CTuikuanWnd::HandleTuikuan()
 	//生成随机的order_no
 
 	std::map<string, string> params;
-	params["out_trade_no"] = CLewaimaiString::UnicodeToUTF8(m_tuikuanma);
+	params["third_trade_no"] = CLewaimaiString::UnicodeToUTF8(m_tuikuanma);
+	params["money"] = CLewaimaiString::UnicodeToUTF8(m_money);
 
 	std::string response;
 
-	std::string url = "/shouyin/refund_out_trade_no";
+	std::string url = "/saomashoukuan/refundbythirdtradeno";
 	CZhipuziHttpClient::Request(url.c_str(), params, response);
 
 	rapidjson::Document document;
@@ -495,12 +520,26 @@ void CTuikuanWnd::HandleTuikuan()
 	if (document.HasParseError())
 	{
 		LOG_INFO("parse response error!");
+
+		m_tuikuan_status = 4;
+
+		m_fail_message = "服务器错误!";
+
+		SendMessage(WM_TUIKUAN_STATUS_FAIL, 0, 0);
+
 		return;
 	}
 
 	if (!document.HasMember("errcode") || !document.HasMember("errmsg") || !document.HasMember("data"))
 	{
 		LOG_INFO("json error!");
+
+		m_tuikuan_status = 4;
+
+		m_fail_message = "服务器错误!";
+
+		SendMessage(WM_TUIKUAN_STATUS_FAIL, 0, 0);
+
 		return;
 	}
 
@@ -509,6 +548,13 @@ void CTuikuanWnd::HandleTuikuan()
 	if (errcode != 0)
 	{
 		LOG_INFO("response failed! message:" << document["errmsg"].GetString());
+
+		m_tuikuan_status = 4;
+
+		m_fail_message = "服务器错误!";
+
+		SendMessage(WM_TUIKUAN_STATUS_FAIL, 0, 0);
+
 		return;
 	}
 
@@ -519,19 +565,94 @@ void CTuikuanWnd::HandleTuikuan()
 
 	if (s_status == "success")
 	{
-		//支付成功
+		//退款成功
 		m_tuikuan_status = 3;
 
 		SendMessage(WM_TUIKUAN_STATUS_SUCCESS, 0, 0);
 	}
 	else if (s_status == "fail")
 	{
-		//支付失败
+		//退款失败
 		m_tuikuan_status = 4;
 
-		m_fail_message = data["message"].GetString();
+		m_fail_message = data["errmsg"].GetString();
 
 		SendMessage(WM_TUIKUAN_STATUS_FAIL, 0, 0);
 	}
+	else if (s_status == "refunding")
+	{
+		//退款还在处理中
+		m_tuikuan_status = 2;
+
+		m_out_trade_no = data["out_trade_no"].GetString();
+
+		//需要查询支付状态
+		SendMessage(WM_TUIKUAN_STATUS_NEEDPASSWORD, 0, 0);
+	}
 }
 
+void CTuikuanWnd::HandleTuikuanPassword()
+{
+	std::map<string, string> params;
+
+	params["out_trade_no"] = m_out_trade_no;
+
+	while (m_tuikuan_status == 2)
+	{
+		std::string response;
+
+		std::string url = "/saomashoukuan/queryorderrefundstatus";
+		CZhipuziHttpClient::Request(url.c_str(), params, response);
+
+		rapidjson::Document document;
+		document.Parse(response.c_str());
+
+		if (document.HasParseError())
+		{
+			LOG_INFO("parse response error!");
+			return;
+		}
+
+		if (!document.HasMember("errcode") || !document.HasMember("errmsg") || !document.HasMember("data"))
+		{
+			LOG_INFO("json error!");
+			return;
+		}
+
+		rapidjson::Value& v_errcode = document["errcode"];
+		int errcode = v_errcode.GetInt();
+		if (errcode != 0)
+		{
+			LOG_INFO("response failed! message:" << document["errmsg"].GetString());
+			return;
+		}
+
+		rapidjson::Value& data = document["data"];
+		rapidjson::Value& status = data["status"];
+
+		std::string s_status = status.GetString();
+
+		if (s_status == "success")
+		{
+			m_tuikuan_status = 3;
+
+			SendMessage(WM_TUIKUAN_STATUS_SUCCESS, 0, 0);
+
+			break;
+		}
+		else if (s_status == "fail")
+		{
+			//退款失败了
+			m_tuikuan_status = 4;
+
+			m_fail_message = data["errmsg"].GetString();
+
+			SendMessage(WM_TUIKUAN_STATUS_FAIL, 0, 0);
+		}
+		else if (s_status == "refunding")
+		{
+			//这个只是表示状态未知
+			Sleep(1000);
+		}
+	}
+}

+ 7 - 2
zhipuzi_pay_plugin/wnd/CTuikuanWnd.h

@@ -50,6 +50,8 @@ public:
 
 	LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
 
+	LRESULT OnTuikuanNeedPassword(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
 	LRESULT OnTuikuanSuccess(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
 
 	LRESULT OnTuikuanFail(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
@@ -68,6 +70,9 @@ public:
 	//处理收款
 	void HandleTuikuan();
 
+	//处理收款的密码查询
+	void HandleTuikuanPassword();
+
 public:
 	CPaintManagerUI m_pm;
 
@@ -81,11 +86,11 @@ public:
 	int m_tuikuan_status = 0;
 
 	std::string m_order_no;
-	std::string m_trade_no;
+	std::string m_out_trade_no;
 
 	std::string m_fail_message;
 
 	//窗口关闭的定时器时间
-	int m_timer_now = 3;
+	int m_timer_now = 4;
 };