msgpay.java
来自「j2me 连连看源代码」· Java 代码 · 共 351 行
JAVA
351 行
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.io.Connector;
import javax.wireless.messaging.MessageConnection;
import javax.wireless.messaging.TextMessage;
/*
* MsgPay.java
* 用于通过短信的形式,用户把指令发送SP的端口号上进行付款
*
* 测试通过的手机型号包括
* Moto E398 V300
* Nokia 3230 7260 6101 3100 (QD,7650不支持)
* 索爱 W550C (K700C,K300C不支持)
* 详细说明,请看最底部的文字说明
*/
public final class MsgPay{
/**
* 端口号
* 即发送SP在移动上所注册的端口号,由SP规定
* 暂时有两个,如有新的,日后补充
* 测试时,程序员可以修改为任意中国移动的手机号码,如"13888888888"、自己或同事的号码
*/
/**跟指令DICTATE_30组合,就收取1.0元的资费*/
private final String PORT_106691608 = String.valueOf(1066916088);//"106691608";
/**
* 收费模式 Mode
*/
/**按关收费*/
public static final byte PM_PERLEVEL = 10;
/**道具/技能收费*/
public static final byte PM_THING_SKILL =11;
/**复活/时间收费*/
public static final byte PM_RELIVE_TIME =12;
/**游戏币收费*/
public static final byte PM_GAMEMONEY =13;
/**一次性收费*/
public static final byte PM_ONCE =14;
//---------- 下面为自定义的收费模式 -----------------
//先跟SP方商量好收费模式,经及收费代码
/**挑战模式*/
public static final byte PM_CHALLENGE = 15;
/**第二主角*/
public static final byte PM_SECONDACTOR = 16;
/**
* 指令内容
* 即所发信息的内容,由SP规定
* 暂时有一个,如有新的,日后补充
* 测试时可以任意内容,如"你好"
*/
/**指令内容*/
private final String DICTATE_30 = "633";//"30"
/**是否已经付款的记录名*/
private final String strRecordName="payRecode";
/**游戏号*/
private String strGameID = null ;
private String strGameInfo = null;
//发送消息结果
/**发送成功*/
public static final byte SEND_SUCCESS = 0;
/**发送失败,发送时用户按了取消*/
public static final byte SEND_USERCANCLE = 1;
/**发送失败,手机卡过期,非移动的电话卡,或余额不足订购费用其它失败原因*/
public static final byte SEND_FAIL = 2;
/**没有记录*/
public static final byte SEND_NOREC = -1;
GameMIDlet mid;
/** 构造函数 */
public MsgPay(GameMIDlet mid) {
this.mid = mid;
setGameID();
}
private void setGameID(){
String strGameInfoTemp = getGameInfo();
if(strGameInfoTemp!=null){
strGameInfo=strGameInfoTemp;
}else{
strGameID = "NOFILE";
strGameInfo = "NOFILE";
}
}
/**
* 得到所下载网站的ID
* 这里由SP来定,开发时没有该文件也没有问题
*/
private String getGameInfo(){//由SP来定
String strWebID = null;
InputStream in = getClass().getResourceAsStream("/w.w");
DataInputStream dis = new DataInputStream(in);
if(in!=null){
try {
strGameID = String.valueOf(dis.readInt());
strWebID="G"+strGameID+"W"+dis.readInt()+"PS"+dis.readInt();
//"G"+游戏编号+"W"+网站ID+"PS"+手机型号
} catch (IOException ex) {
ex.printStackTrace();
}finally{
try {
dis.close();
dis = null;
in = null;
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
return strWebID;
}
/** 返回游戏号 */
public String getGameID(){
return strGameID;
}
byte value = -127;
String operate,spid;
/**付款1.0元*/
public byte payOneYuan(byte iPayMode){
strPort = PORT_106691608;
strDictate = DICTATE_30;
strPayMode = String.valueOf(iPayMode);
value = -127;
InputStream input = getClass().getResourceAsStream("/u.u");
DataInputStream dis = new DataInputStream(input);
if(input!=null){
try {
strDictate = String.valueOf(dis.readInt());
strPort = String.valueOf(dis.readInt());
System.out.println("strDictate=="+strDictate);
System.out.println("strPort=="+strPort);
} catch (IOException ex) {
ex.printStackTrace();
}finally{
try {
dis.close();
dis = null;
input = null;
} catch (IOException ex) {
ex.printStackTrace();
}
}
}else{
}
Thread sender = new Thread(){
public void run(){
MessageConnection conn =null;
try {
//#if TXT
//# readCpid();
//# String address = "sms://" + spid;
//#else
String address = "sms://" + strPort;
//#endif
conn = (MessageConnection)Connector.open(address);
//设置短信息类型为文本,短信息有文本和二进制两种类型
TextMessage msg = (TextMessage)conn.newMessage(MessageConnection.TEXT_MESSAGE);
msg.setAddress(address);
//设置信息内容
//#if TXT
//# msg.setPayloadText(operate);
//#else
msg.setPayloadText(strDictate+strGameInfo+"PM"+strPayMode);
//#endif
//发送
conn.send(msg);
setValue(SEND_SUCCESS);
}catch(SecurityException ex1){
//当手机系统询问用户是否发出信息,用户选择“否”时,会抛出这个异常
//不想显示时,可以把 ex1.printStackTrace() 语句注释
//未处理
setValue(SEND_USERCANCLE);
System.out.println("SEND_USERCANCLE");
ex1.printStackTrace();
mid.instance.exitGame();
} catch (IOException ex) {
System.out.println("SEND_FAIL");
//未处理
ex.printStackTrace();
setValue(SEND_FAIL);
mid.instance.exitGame();
}catch(Exception ex){
System.out.println("SEND_NOREC");
setValue(SEND_NOREC);
ex.printStackTrace();
mid.instance.exitGame();
}finally{
try {
if(conn!=null)conn.close();
} catch (IOException ex) {
ex.printStackTrace();
mid.instance.exitGame();
}
}
}
};
sender.start();
while(getValue()<0){
try{
Thread.sleep(20);
}catch(Exception e){
e.printStackTrace();
}
}
return getValue();
}
synchronized byte getValue(){
return value;
}
synchronized void setValue(byte value){
this.value = value;
}
void readCpid(){
try{
InputStream is = this.getClass().getResourceAsStream("/sms.txt");
StringBuffer sb = new StringBuffer();
int c;
while((c=is.read())!=-1){
if(((char)c)==','){
operate = sb.toString().trim();
sb = null;
sb = new StringBuffer();
continue;
}
sb.append((char)c);
}
spid = sb.toString().trim();
System.out.println(operate+","+spid);
is.close();
}catch(Exception e){
e.printStackTrace();
}
}
String strPort,strDictate,strPayMode;
/**通常的失败提示*/
static final String strPayFail[] ={
"原因可能如下:",
"并非中国移动用户",
"电话卡已经过期",
"余额不足",
"信号不足",
"其它",
} ;
private static String strGameName = "象棋之女上男下";
/**
* 更多的失败提示
* 可按程序的实际情况对下列提示作适当的设置
*/
//#ifdef E398
//# static final String strPayFailMore = "如果按支付后,直接转到用户取消页面,请按下面步骤设置:^完全退出游戏,然后"+
//# "游戏和程序->"+strGameName+"->按菜单键->许可->相关网络->信息->右软键更改->选择'总是询问'."+
//# "再重新打开'"+strGameName+"'就可以付费,并进行游戏."+
//# "^本游戏收费暂时不支持索爱K700C,K300C,诺基亚的QD和7650";
//#elif V600
//# static final String strPayFailMore = "如果按支付后,直接转到用户取消页面,请按下面步骤设置:^完全退出游戏,然后"+
//# "游戏和程序->"+strGameName+"->按菜单键->许可->相关网络->信息->右软键更改->选择'总是询问'."+
//# "再重新打开'"+strGameName+"'就可以付费,并进行游戏."+
//# "^本游戏收费暂时不支持索爱K700C,K300C,诺基亚的QD和7650";
//#elif N7610
//# static final String strPayFailMore = "如果按支付后,直接转到用户取消页面,请按下面步骤设置:^完全退出游戏,然后"+
//# "转到功能表->工具->程序管理->"+strGameName+"->左软键选项->设置->信息->左软键选项更改->选择'每次询问'."+
//# "再重新打开'"+strGameName+"'就可以付费,并进行游戏."+
//# "^本游戏收费暂时不支持索爱K700C,K300C,诺基亚的QD和7650";
//#elif K700
//# static final String strPayFailMore = "如果按支付后,直接转到用户取消页面,请按下面步骤设置:^完全退出游戏,然后"+
//# "游戏->"+strGameName+"->右软键更多->权限->信息功能->选择'每次询问'."+
//# "再重新打开'"+strGameName+"'就可以付费,并进行游戏."+
//# "^本游戏收费暂时不支持索爱K700C,K300C,诺基亚的QD和7650";
//#elif N7210
//# static final String strPayFailMore = "如果按支付后,直接转到用户取消页面,请按下面步骤设置:^完全退出游戏,然后"+
//# "到功能表->百宝箱->选择应用软件->左软键选择->"+strGameName+"->左软键操作->接入网络->选择'先询问',"+
//# "再重新打开'"+strGameName+"'就可以付费,并进行游戏."+
//# "^本游戏收费暂时不支持索爱K700C,K300C,诺基亚的QD和7650";
//#elif N7260
//# static final String strPayFailMore = "如果按支付后,直接转到用户取消页面,请按下面步骤设置:^完全退出游戏,然后"+
//# "转到百宝箱->收藏->选择应用软件->"+strGameName+"->操作->应用软件接入->通讯->信息服务->选择'每次询问',O"+
//# "再重新打开'"+strGameName+"'就可以付费,并进行游戏."+
//# "^本游戏收费暂时不支持索爱K700C,K300C,诺基亚的QD和7650";
//#else
static final String strPayFailMore = "如果按支付后,直接转到用户取消页面,请按下面步骤设置:^完全退出游戏,然后"+
"游戏->"+strGameName+"->右软键更多->权限->信息功能->选择'每次询问'," +
"再重新打开'"+strGameName+"'就可以付费,并进行游戏."+
"^本游戏收费暂时不支持索爱K700C,K300C,诺基亚的QD和7650";
//#endif
}
/**
* 开 发 注 意
*
* 1.需要用户短信付款前,请在游戏中以明文形式向用户说明收费,(参考):"本游戏收
* 费**元,如果支付,请选“是”,稍候将会收到收费提示短信。",如果是通过电话费买游戏
* 币的,可以提示为“一元可换得游戏币50,如果支付,请选“是”,稍候将会收到收费提示短
* 信。”并可以给用户选择是否发送这操作。发送信息的时间因手机的不同,所用时间会有长短,
* 必要时请用界面形式说明,如“发送中...”。
*
* 2.发送信息后,请根据返回值作相应的处理,如发送成功,用户取消了,或发送失败。
*
*
* 主要几种付费方式
*
* 一、按关收费
*
* 二、道具/技能收费
*
* 三、复活/时间收费
*
* 四、游戏币收费
*
* 五、一次性收费
*
* 六、共同商议
*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?