Namespaces
Variants
Actions

QIAP--IAP的Qt接口

Jump to: navigation, search
Article Metadata

Article
Created: renlin (16 Feb 2012)
Last edited: renlin (11 Jul 2012)

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;
}

源码下载

QIAP Example 下载

相关链接及参考文献

Add categories below. Remove Category:Draft when the page is complete or near complete

This page was last modified on 11 July 2012, at 06:15.
133 page views in the last 30 days.
Nokia Developer aims to help you create apps and publish them so you can connect with users around the world.

京ICP备05048969号  © Copyright Nokia 2013 All rights reserved