#include "WxPayApi.h"
namespace WxAPI{
HttpService * WxPayApi::service = new HttpService;
WxPayApi::WxPayApi(QObject *parent):PayApi(parent)
{
}
void WxPayApi::Micropay( WxPayData &inputObj)
{
qDebug("Micropay is processing...");
QString url = "https://api.mch.weixin.qq.com/pay/micropay";
QString out_trade_no = "";
inputObj.GenerateOutTradeNo(out_trade_no);
this->out_trade_no = out_trade_no;
inputObj.SetValue("out_trade_no",out_trade_no);//产生随机的商户订单号
//检测必填参数
if (!inputObj.IsSet("body"))
{
qDebug("提交被扫支付API接口中,缺少必填参数body!");
return;
}
else if (!inputObj.IsSet("out_trade_no"))
{
qDebug("提交被扫支付API接口中,缺少必填参数out_trade_no!");
return;
}
else if (!inputObj.IsSet("total_fee"))
{
qDebug("提交被扫支付API接口中,缺少必填参数total_fee!");
return;
}
else if (!inputObj.IsSet("auth_code"))
{
qDebug("提交被扫支付API接口中,缺少必填参数auth_code!");
return;
}
//inputObj.SetValue("limit_pay", "no_credit");//不能使用信用卡
inputObj.SetValue("spbill_create_ip", WxPayConfig::IP);//终端ip
inputObj.SetValue("appid", WxPayConfig::APPID);//公众账号ID
inputObj.SetValue("mch_id", WxPayConfig::MCHID);//商户号
QString randString;
inputObj.CreateRandString(randString);
inputObj.SetValue("nonce_str",randString);//随机字符串
QString sign;
inputObj.MakeSign(sign);
inputObj.SetValue("sign",sign);//签名
QString xml;
inputObj.ToXml(xml);
service->Post(xml,url,[&](WxPayData *data){
data->print();
if (data->GetValue("return_code").toString() == "-1") {
emit emitPayResult(-1,"网络异常,请稍后再试!");
delete data;
return;
}
//如果提交被扫支付接口调用失败,则抛异常
if (!data->IsSet("return_code") || data->GetValue("return_code").toString() == "FAIL")
{
QString returnMsg = data->IsSet("return_msg") ? data->GetValue("return_msg").toString() : "";
//Toast::showMessage(returnMsg);
qDebug("Micropay API interface call failur"+returnMsg.toUtf8() );
emit emitPayResult(-1,returnMsg);
delete data;
return;
}
//签名验证
data->CheckSign();
//刷卡支付直接成功
if(data->GetValue("return_code").toString() == "SUCCESS" &&
data->GetValue("result_code").toString() == "SUCCESS")
{
emit emitPayResult(0,"支付成功");
qDebug("支付成功");
delete data;
return;
}
/******************************************************************
* 剩下的都是接口调用成功,业务失败的情况
* ****************************************************************/
//1)业务结果明确失败
if(data->GetValue("err_code").toString() != "USERPAYING" &&
data->GetValue("err_code").toString() != "SYSTEMERROR")
{
QString returnMsg = data->IsSet("err_code_des") ? data->GetValue("err_code_des").toString() : "";
qDebug("Micropay API interface call success, business failure,"+returnMsg.toUtf8() );
emit emitPayResult(-1,returnMsg);
delete data;
return;
}
delete data;
//2)不能确定是否失败,需查单
//用商户订单号去查单
times = 10;
if (!timer) {
timer = new QTimer;
timer->setInterval(2000);
connect(timer,&QTimer::timeout,this,&WxPayApi::loolQueryPay);
timer->start(3000);
}
});
}
void WxPayApi::loolQueryPay()
{
if (times-->0) {
OrderQuery(false,this->out_trade_no);
}else{
if (timer&&timer->isActive()) {
timer->stop();
delete timer;
timer= 0;
}
qDebug("Micropay failure, Reverse order is processing...");
depth=1;
Reverse(false,this->out_trade_no);
emit emitPayResult(-1,"支付失败!");
}
}
void WxPayApi::OrderQuery(bool isTransactionId ,const QString & id){
qDebug("MicroPay OrderQuery 第%d次查询",10-times);
QString url = "https://api.mch.weixin.qq.com/pay/orderquery";
WxPayData inputObj;
if (isTransactionId) {
inputObj.SetValue("transaction_id",id);
}else{
inputObj.SetValue("out_trade_no",id);
}
//检测必填参数
if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))
{
qDebug("订单查询接口中,out_trade_no、transaction_id至少填一个!");
return;
}
inputObj.SetValue("appid", WxPayConfig::APPID);//公众账号ID
inputObj.SetValue("mch_id", WxPayConfig::MCHID);//商户号
QString randString;
inputObj.CreateRandString(randString);
inputObj.SetValue("nonce_str",randString);//随机字符串
QString sign;
inputObj.MakeSign(sign);
inputObj.SetValue("sign",sign);//签名
QString xml;
inputObj.ToXml(xml);
service->Post(xml,url,[&](WxPayData *result){
result->print();
if (result->GetValue("return_code").toString() == "-1") {
if (timer&&timer->isActive()) {
timer->stop();
delete timer;
timer= 0;
}
emit emitPayResult(-1,"网络异常,请稍后再试!");
delete result;
return;
}
if(result->GetValue("return_code").toString() == "SUCCESS"
&& result->GetValue("result_code").toString() == "SUCCESS")
{
//支付成功
if(result->GetValue("trade_state").toString() == "SUCCESS")
{
if (timer&&timer->isActive()) {
timer->stop();
delete timer;
timer= 0;
}
qDebug("查询订单,支付成功");
emit emitPayResult(0,"支付成功");
delete result;
return;
}
//用户支付中,需要继续查询
else if(result->GetValue("trade_state").toString() == "USERPAYING")
{
qDebug("正在支付,继续查询订单");
QString returnMsg = result->IsSet("trade_state_desc") ? result->GetValue("trade_state_desc").toString() : "";
emit emitPayResult(1,returnMsg);
delete result;
return;
}else{
delete result;
}
}
//如果返回错误码为“此交易订单号不存在”则直接认定失败
if(result->GetValue("err_code").toString() == "ORDERNOTEXIST")
{
if (timer&&timer->isActive()) {
timer->stop();
delete timer;
timer= 0;
}
emit emitPayResult(-1,"支付失败");
qDebug("查询订单,支付失败");
delete result;
return;
}
else
{
//如果是系统错误,则后续继续
qDebug("系统错误,继续查询订单");
delete result;
return;
}
delete result;
});
}
//撤销订单API接口
void WxPayApi::Reverse(bool isTransactionId ,const QString & id){
qDebug("MicroPay Reverse 第%d撤销订单",depth);
if(depth > 10)
{
return;
}
QString url = "https://api.mch.weixin.qq.c
没有合适的资源?快使用搜索试试~ 我知道了~
QT 支付宝,微信支付
共79个文件
cpp:30个
h:29个
ui:7个
5星 · 超过95%的资源 需积分: 44 75 下载量 165 浏览量
2018-03-09
11:59:15
上传
评论 8
收藏 48KB 7Z 举报
温馨提示
最近做了一个新项目,涉及到支付宝和微信支付,支付宝和微信都是业界的老大哥,相信大家都有所觉得文档、SDK都是各种坑吧(纯粹吐槽而已)
资源推荐
资源详情
资源评论
收起资源包目录
Pay.7z (79个子文件)
WxPayData.cpp 4KB
cert
apiclient_key.pem 2KB
ali_privte_key.pem 2KB
apiclient_cert.pem 2KB
ali_public_key.pem 451B
apiclient_cert.p12 3KB
alipaystatus.cpp 447B
ProgressDialog.cpp 999B
AliTradePayResult.cpp 3KB
PolicePay.pro.user 23KB
Toast.h 219B
TradeStatus.cpp 297B
WxPayView.h 654B
image.qrc 222B
WxPayView.ui 4KB
WxPayConfig.cpp 746B
WxRefund.h 693B
AliTradeCancelResult.cpp 824B
img
alipay.png 3KB
wxpay.png 3KB
alipay_hover.png 3KB
wxpay_hover.png 3KB
AliPayRefundResult.h 2KB
AliPayRefundResult.cpp 2KB
PolicePay.pro 3KB
AliApi.h 1KB
AliTradeCancelResult.h 847B
myapp.ico 42KB
ResultEnum.h 172B
WxRefund.cpp 2KB
WxPayConfig.h 2KB
WxRefundQueryView.h 498B
Toast.cpp 243B
ALiPayData.cpp 6KB
PayData.h 993B
tradestatus.h 325B
HiProgressIndicator.cpp 2KB
AliPayConfig.h 904B
HiProgressIndicator.h 3KB
WxRefundQueryView.ui 3KB
WxPayDialog.ui 4KB
ProgressDialog.h 618B
AliPayResult.h 728B
MainWindow.ui 4KB
AliPayResult.cpp 853B
ProgressDialog.ui 2KB
AliHttpService.cpp 8KB
AliPayDialog.cpp 4KB
AliTradeQueryResult.h 633B
WxPayApi.h 2KB
SignUtil.cpp 3KB
AliTradePayResult.h 3KB
AliHttpService.h 824B
AliPayDialog.ui 7KB
WxPayData.h 975B
PyException.h 242B
MainWindow.h 480B
AliPayDialog.h 798B
AliPayConfig.cpp 1KB
SignUtil.h 756B
main.cpp 181B
HttpService.cpp 3KB
PayData.cpp 1KB
HttpService.h 878B
WxPayApi.cpp 15KB
MainWindow.cpp 443B
AliApi.cpp 9KB
WxPayView.cpp 2KB
WxPayDialog.h 747B
WxPayDialog.cpp 2KB
WxRefund.ui 3KB
WxRefundQueryView.cpp 659B
AliTradeQueryResult.cpp 319B
http.cpp 41B
PayApi.h 170B
PayApi.cpp 80B
AliPayStatus.h 516B
ALiPayData.h 1KB
PyException.cpp 168B
共 79 条
- 1
资源评论
- xiongda2021-01-18下载下来学习学习
fxd09151129
- 粉丝: 2
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功