C++ QT rsa2 加密方式 支付宝扫码付款

前提:

        因为支付宝没有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&timestamp=%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&timestamp=" . $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;

资源地址:

https://download.csdn.net/download/linkang1024/10796499

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值