QIAP--IAP的Qt接口
Contents |
Introduction
我们在程序内支付功能--Qt解决方案, 程序内支付(IAP)编程及例子解析中介绍了使用IAP API发布程序内支付应用的方法,现在IAP 家族又有了新成员-QIap, 它是一个IAP 的Wrapper class ,即为IapClient类提供了Qt的接口,以方便Qt的开发者。关于QIap的源代码可以参考QIap.关于IAP的概念这里不再赘述,前面两篇文章已经介绍的很清楚了。
开始使用QIap
设置
下载QIap的相关文件,并复制到自己的项目中,修改应用的.pro文件如下:
symbian {
# Enables In-App Purchase API
DEFINES += IN_APP_PURCHASE
contains(DEFINES, IN_APP_PURCHASE) {
include(./qiap/in-app-purchase.pri)
}
}创建应用所需的IAP文件:
1.<drive>:\myproject\data\ — 支付所需的资源文件
2.<drive>:\myproject\data\resourceid_XXXXXX\ — XXXXXX 是由Nokia Publish返回的六位数字的的in-app ID 。
3.IAP_VARIANTID.TXT —文件的内容是 000000 (6个0), 这是使用 the In-App Purchase API所必须的. 挡你上传应用到Nokia Publish时, Nokia Publish 在IAP_VARIANTID.TXT中写入获取DRM所需的数据.
4.TEST_MODE.TXT — 用来模拟支付的文件,在真实的支付时移除该文件.
关于这些文件的更多详细内容参考这里。
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui/QMainWindow>
#ifdef IN_APP_PURCHASE
#include "qiap.h"
#endif
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
virtual ~MainWindow();
private slots:
#ifdef IN_APP_PURCHASE
private:
QIap* iap_manager;
private slots:
void getProductsCompleted();
void restoreProductsCompleted();
void purchaseFlowFinished(int);
void purchaseCompleted(QString status, QString productID);
void itemRestored(QString);
#endif
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
#ifdef IN_APP_PURCHASE
iap_manager = new QIap(this);
connect(iap_manager, SIGNAL(getProductsCompleted()), this, SLOT(getProductsCompleted()));
connect(iap_manager, SIGNAL(restoreProductsCompleted()), this, SLOT(restoreProductsCompleted()));
connect(iap_manager, SIGNAL(itemRestored(QString)), this, SLOT(itemRestored(QString)));
connect(iap_manager,SIGNAL(purchaseCompleted(QString, QString)),this,SLOT(purchaseCompleted(QString, QString)));
connect(iap_manager,SIGNAL(purchaseFlowFinished(int)),this,SLOT(purchaseFlowFinished(int)));
#endif
}
void MainWindow::buyProduct(QString productId)
{
iap_manager->purchaseProductByID(productId, IAPClient::ForcedAutomaticRestoration);
}
purchaseProductByID 是用过产品的ID来进行支付的方法. 使用IAPClient::ForcedAutomaticRestoration 参数更好.
void MainWindow::purchaseCompleted(QString status, QString productID){
qDebug() << "purchaseCompleted: status :" << status;
qDebug() << "purchaseCompleted: item ID:" << productID;
if( status == "OK"){
QString fileName = "/resourceid_"+productID+"/";
switch( productID.toInt() ){
case 813279 : fileName.append("video.csv"); break;
case 821073 : fileName.append("photo.txt"); break;
default : break;
}
// DRMFile file;
QString filepath = QApplication::applicationDirPath();
filepath.append("/drm/data");
filepath.append(fileName);
uchar* buffer = NULL;
int len = iap_manager->getDRMFileContent(filepath, buffer);
if(len>0) {
QString content = QString::fromAscii((char*)buffer,len);
qDebug() << content;
QMessageBox::information(this,"IAP Example", content);
} else {
qDebug() << "Error reading DRM file";
QMessageBox::critical(this,"IAP Example", "Error reading DRM file");
}
delete buffer;
} else
QMessageBox::critical(this,"IAP Error", status);
}当支付过程完成,获取交易 status 和 managed ID product. 如果用户放弃支付则Status 为 "Cancel".
void MainWindow::purchaseFlowFinished(int value){
qDebug() << "purchaseFlowFinished:"<<QString::number(value);
qDebug() << "purchaseFlowFinished item ID:"<<iap_manager->currentPruductID();
}当用户关闭IAP窗口时触发purchaseFlowFinished ,并将控制权交回给main GUI.
Restoration Process
Restoration Process 是获得已经支付过的产品 。
可以用使用QIap:: restoreProducts() 方法来restore 所有已经支付的产品. 为每个retored 项发出信号 itemRestored(QString)。
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){
connect(iap_manager, SIGNAL(itemRestored(QString)), this, SLOT(itemRestored(QString)));
}void MainWindow::itemRestored(QString productID) {
qDebug() << "Restoring item :" << productID;
}源码下载
相关链接及参考文献
Add categories below. Remove Category:Draft when the page is complete or near complete


(no comments yet)