前提:
因为支付宝没有C++ rsa2加密的支付demo,所以本博主采用了支付使用qt进行https支付, 加密调用php脚本进行加密。
环境:
Qt 5.5.1
php7.0 需要开启php_openssl.dll , 这个自行百度, 就改个php.ini文件。
废话少说直接上代码:
qt:
void Widget::on_pushButton_clicked()
{
QDateTime time = QDateTime::currentDateTime();
QString timestamp = time.toString("yyyy-MM-dd hh:mm:ss");
QString phTimestamp = QString::number(time.toTime_t()); //时间戳 php脚本使用
QString order_id = randNums(11); //订单号 11位随机数
QString code = ui->lineEdit->text();
QString price = "0.01";
QString app_id = "xxxxxxxxxxxx"; //支付宝app_id
// 执行php脚本 传递时间戳 订单id 条码 价钱 进行加密
QProcess pro(0);
QString cmd = QString("php.exe rsa2.php %0 %1 %2 %3").arg(phTimestamp).arg(order_id).arg(code).arg(price);
pro.start(cmd);
pro.waitForFinished();
QString tmp = pro.readAllStandardOutput();
//解析返回的sign 数据
QString signKey = "sign:";
int index = tmp.lastIndexOf(signKey);
QString sign = tmp.right(tmp.length() - index - signKey.length());
// 巨坑 通讯过程因为编码的不一样 +号会变成空格 所以把+号转成url编码
sign = sign.replace("+", "%2B");
//组合字符数据
QByteArray postdata;
postdata.append(QString("app_id=%0&biz_content={").arg(app_id));
postdata.append(QString("\"out_trade_no\":\"%0\",").arg(order_id));
postdata.append("\"scene\":\"bar_code\",");
postdata.append(QString("\"auth_code\":\"%0\",").arg(code));
postdata.append("\"subject\":\"wggtest\",");
postdata.append(QString("\"total_amount\":%0,").arg(price));
postdata.append("\"timeout_express\":\"1m\"}");
postdata.append(QString("&charset=utf-8&method=alipay.trade.pay&sign_type=RSA2×tamp=%0&version=1.0&").arg(timestamp));
postdata.append(QString("sign=%0").arg(sign));
QNetworkRequest request;
QUrl url("https://openapi.alipay.com/gateway.do");
request.setUrl(url);
//这只utf-8 编码
request.setRawHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8");
m_NetManager->post(request,postdata);
}
php rsa2.php:
<?php
if ($argc != 5) {
echo "missing parameter";
return;
}
$priKey = '支付宝私钥';
$res = "-----BEGIN RSA PRIVATE KEY-----\n" .
wordwrap($priKey, 64, "\n", true) .
"\n-----END RSA PRIVATE KEY-----";
$timestamp = $argv[1];
$time = date("Y-m-d H:i:s", $timestamp); //传参时是用时间戳传送 这里再转换一下
$order_id = $argv[2]; //传参 订单id
$code = $argv[3]; //传参 支付条码
$price = $argv[4]; //传参 支付金额
$piKey = openssl_pkey_get_private($res);
//这里的数据 一定要和qt 进行http时的数据要一致
$data = "app_id=支付宝appid&biz_content={\"out_trade_no\":\"" . $order_id . "\",\"scene\":\"bar_code\",\"auth_code\":\"" . $code . "\",\"subject\":\"wggtest\",\"total_amount\":" . $price . ",\"timeout_express\":\"1m\"}&charset=utf-8&method=alipay.trade.pay&sign_type=RSA2×tamp=" . $time . "&version=1.0";
echo $data;
if ($piKey) {
$res = openssl_get_privatekey($res);
openssl_sign($data, $sign, $res, OPENSSL_ALGO_SHA256);
$sign = base64_encode($sign);
} else {
echo '私钥不可用';
}
//返回加密结果
echo "sign:".$sign;
资源地址: