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 + -
显示快捷键?