短信支付
2015-11-13 17:31:02 1 举报
AI智能生成
短信支付SDK
作者其他创作
大纲/内容
发送短信
Sms
继承自Pay
包含短信发送的四个状态:没有发送、发送中、发送成功、发送失败;信息内容;发送地址;超时;
run();
发送短信
调用父类run()方法,setExecuteStatus(EXECUTE_STATUS_RUN);
以通过getBroadcast(Context context, int requestCode, Intent intent, int flags)方法从系统取得一个用于向BroadcastReceiver的发送广播的PendingIntent对象.
getContext().registerReceiver(sendBroadCast,
new IntentFilter(broadCast)); sendBroadcast为自定义的广播接收器
content = URLDecoder.decode(content, "utf-8");//将短信内容中的application/x-www-form-rulencoded MIME字符串转换成普通字符串
如果短信内容以"binmessage:"开始
裁剪短信content = content.substring("binmessage:".length(),
content.length());
发送短信
smsManager.sendDataMessage(address, null, destinationPort,
Base64UTF.decode(content.getBytes("utf-8")),
pendingIntent, null);
设置sendStatus = SMS_SEND_STATUS_SEND_ING;
启动短信监听new SmsListen().start();
else
发送短信
smsManager.sendTextMessage(address, null,
new String(content.getBytes(), "utf-8"), pendingIntent,
null);
设置sendStatus = SMS_SEND_STATUS_SEND_ING;
启动短信监听new SmsListen().start();
自定义广播接收器SendBroadCast
重写onRecive();
短信发送成功
WCConnect.getInstance().PostLog(
"SMSSendStatus:-1" + Config.splitStringLevel1 + address
+ Config.splitStringLevel1 + content
+ Config.splitStringLevel1 + "SendOK");
EPManager.getInstance().payHandler
.sendEmptyMessage(Config.CMD_SENDSMSSUCCESS);
if (WCConnect.getInstance().currentPayFeeMessage != null)
timeStamp = (String) WCConnect.getInstance().currentPayFeeMessage
.get("TimeStamp");
EPManager.getInstance().sendMessage(URLFinals.WEB_SMSSTATIC,
feeSMSStatusMessage, null);
else
timeStamp = "未知流水号 AppKey:"
+ CommonUtils.getAppKey(context);
EPManager.getInstance().sendMessage(URLFinals.WEB_SMSSTATIC,
feeSMSStatusMessage, null);
短信发送失败
EPManager.getInstance().payHandler
.sendEmptyMessage(Config.CMD_SENDSMSERROR);
WCConnect.getInstance().PostLog(
"SMSSendStatus:" + getResultCode()
+ Config.splitStringLevel1 + address
+ Config.splitStringLevel1 + content
+ Config.splitStringLevel1
+ "SendErro,meybe UserCancel");
if (WCConnect.getInstance().currentPayFeeMessage != null)
timeStamp = (String) WCConnect.getInstance().currentPayFeeMessage
.get("TimeStamp");
EPManager.getInstance().sendMessage(URLFinals.WEB_SMSSTATIC,
feeSMSStatusMessage, null);
设置短信发送状态为完成,setExecuteStatus(EXECUTE_STATUS_COMPLETE);
注销广播接收器
else
timeStamp = "未知流水号 AppKey:"
+ CommonUtils.getAppKey(context);
EPManager.getInstance().sendMessage(URLFinals.WEB_SMSSTATIC,
feeSMSStatusMessage, null);
设置短信发送状态为完成setExecuteStatus(EXECUTE_STATUS_COMPLETE);
注销广播接收器
设置短信发送状态为完成setExecuteStatus(EXECUTE_STATUS_COMPLETE);
注销广播接收器
短信监听器SmsListen
extends Thread
重写run();
如果当前花费时间小于超时时间,while(currentTime < timeout && isListen)
currentTime++;
如果当前花费时间大于超时时间if (currentTime >= timeout)
设置发送状态为失败
EPManager.getInstance().payHandler
.sendEmptyMessage(Config.CMD_SENDSMSERROR);
WCConnect.getInstance().PostLog(
"SMSSendStatus:" + 1
+ Config.splitStringLevel1 + address
+ Config.splitStringLevel1 + content
+ Config.splitStringLevel1
+ "SendErro,meybe UserCancel");
if (WCConnect.getInstance().currentPayFeeMessage != null)
timeStamp = (String) WCConnect.getInstance().currentPayFeeMessage
.get("TimeStamp");
if end
EPManager.getInstance().sendMessage(URLFinals.WEB_SMSSTATIC,
feeSMSStatusMessage, null);
设置执行状态为完成
注销广播接收器
timeStamp = "未知流水号 AppKey:"
+ CommonUtils.getAppKey(context);
else end
EPManager.getInstance().sendMessage(URLFinals.WEB_SMSSTATIC,
feeSMSStatusMessage, null);
设置执行状态为完成
注销广播接收器
支付
Pay
支付基类,包含三种状态,未运行,运行中,运行完成
setExecuteStatus
如果运行完成
CheckLog.log("Pay", "setExecuteStatus", "executeStatus="
+ executeStatus);
如果运行没有完成
CheckLog.log("Pay", "setExecuteStatus", "executeStatus="
+ executeStatus);
PayTask
createTask()
检测任务是否完成,boolean isRunning=false;
新建一个线程 new Thread()
Set> entrySet = payTasks.entrySet();
for (Entry payEntry : entrySet)
判断Pay的执行状态
执行完成
通过短信支付
发送成功if (sendStatus == Sms.SMS_SEND_STATUS_SEND_OK)
payCompleteTasks.put(pay.getKey(), true);
发送失败else if (sendStatus == Sms.SMS_SEND_STATUS_SEND_FIAL)
payCompleteTasks.put(pay.getKey(), false);
通过网页支付
payCompleteTasks.put(pay.getKey(), webPay.isWebPaySuccess());
执行正在进行
isRunning=true;
Set> completeSet = payCompleteTasks
.entrySet();
for (Entry completeTask : completeSet)
Boolean value = completeTask.getValue();
if(value)
Message msg = Message.obtain();
msg.what = Config.CMD_COMPLETE;
msg.obj = "完成支付";
EPManager.getInstance().payHandler.sendMessage(msg);
else
failTaskNum++;
if (!isRunning&&completeSet.size() != 0&& failTaskNum == completeSet.size() && !isResult)
Message msg = Message.obtain();
msg.what = Config.CMD_SENDALLFAIL;
msg.obj = "用户未完成计费流程";
EPManager.getInstance().payHandler.sendMessage(msg);
failTaskNum = 0;
WCConnect
Regedit();初始化计费,请在程序主线程开启时调用
InitConfigSP();初始化链接地址和IP* 此处意思为,从3个IP中选择一个首选IP,避免因为IP地址改变而导致sdk无法连接
创建一个Sharedpreference对象sp_Setting
如果MainIp为空
将MainIp、LinkIp、LinkDomainIp全部添加到sp_Setting中
如果MainIp不为空
直接赋值给Config,Config.MainIp = sp_Setting.getString("MainIp", "");
新起一个线程,重写run();
创建一个Sharedpreference对象sp_Setting
String temp = HttpXmlData.getJson(
Config.getInstance().tpContext, Config.regUrl,
gwclienttype, "");
如果temp为空
重新赋值
如果LinkDomain不为空
将值赋给MainIp
Config.regUrl = "http://" + Config.MainIp
+ "/req.aspx";
temp = HttpXmlData.getJson(
Config.getInstance().tpContext,
Config.regUrl, gwclienttype, "");
再判断如果temp为空
temp = sp_Setting.getString(
Config.CacheKey.CacheRegInfo, null);
如果temp不为空
保存信息到sp_Setting中
Editor editor = sp_Setting.edit();
editor.putString(Config.CacheKey.CacheRegInfo,
temp);
editor.commit();
如果temp不为空
得到服务器数据解析
regResponse = GetRegResponse(temp);
如果数据初始化失败,也即是没有得到数据
EPManager.getInstance().initPaySuccess(
Config.INIT_FAILED);
return;
得到数据宽高、动态密钥、以及Ip地址
Config.deviceWidth = regResponse.getWinwidth();
Config.deviceHeight = regResponse.getWinheight();
Config.AesNewKey = regResponse.getCryptkey();// 动态 密钥
CheckLog.log(this.getClass().getName(), new Exception()
.getStackTrace().toString(), "Config.AesNewKey"
+ Config.AesNewKey);
Config.FeeWindowMode = regResponse.getFeeWindowMode();
// Config.MainIp = regResponse.getMainIp();
Config.LinkIp = regResponse.getLinkIp();
Config.LinkDomain = regResponse.getLinkDomain();
SetConfigSP();更新链接地址
EPManager.getInstance().initPaySuccess(
Config.INIT_SUCCESS);
如果客户端版本为2 or 3 or 4.不做处理
if end
else
// 当前版本先不判断,直接用短信取白名单
String IMSI = HttpXmlData.getIMSI(Config
.getInstance().tpContext);
如果IMSI是以460开头的
获取手机号GetPhoneNumber(IMSI);
else end
获取WC资源列表 String CacheResListString = sp_Setting.getString(
Config.CacheKey.WCCacheResListString, null);
缓存GW收费界面数据
获取网页内容String tempStr = HttpCommon.getHtmlContents(
regResponse.getCacheUrl(), "unionid="
+ Config.UnionId, false).HtmlContents;
如果获取的网页内容不为空
CacheResListString = tempStr;
// 保存信息
Editor editor = sp_Setting.edit();
editor.putString(
Config.CacheKey.WCCacheResListString,
CacheResListString);
editor.commit();
if end
String[] info1 = CacheResListString
.split(Config.splitStringLevel1);
设置一级、二级、三级分隔符
创建Sharedpreference对象sp_Setting
将三大Ip地址全部添加到里面
如果MainIp不为空
Config.MainIp = sp_Setting.getString("MainIp", "");
GetFeeInfo();获取资费提示
Pay(Handler handler, Context myContext, String UserTag,
String OtherInfo, int WCNum, String note);
如果note=null
WCConnect.getInstance().note = "";
if end
CallBackUserTag = URLEncoder.encode(UserTag, "utf-8");
如果网络不可用
this.handler.sendEmptyMessage(NOTNETWORK);
如果类Config的handler不为空
EPManager.getInstance().sendMessage(
URLFinals.WEB_STATISTICAL,
new PayFeeMessage(note, WCNum, 0,
Config.CMD_NOCONFIG_App), null);
SendHanlderMsg(Config.getInstance().tpHandler,
Config.CMD_NOCONFIG_App, "");
CheckLog.log(this.getClass().getName(), new Exception()
.getStackTrace().toString(), "通知客户端,无法计费:");
tempOrderKey = UUID.randomUUID().toString(); // 临时订单号 赋值
else
WCConnect.getInstance().note = note;
else end
同上
EPManager
implements EPEngine
拦截短信
YLSMSreceiver
继承自BroadcastReceiver
重写onReceive();
判断短信接收监听事件是否与intent.getAction相等,如果相等就执行拦截interceptor.handleSMS(intent);
SmsInterceptor
拦截短信的主体类
regInterceptSms() ;
注册短信广播拦截,context.registerReceiver(ylSmsService, filter);
CheckNewSms() ;
新建一个线程间隔1秒轮询下是否有新短信
通过ContentResolver cr=context.getContentResolver();获取ContentResolver实例,并通过Uri获取ContentProvider提供的数据。
Uri uri = Uri.parse(ContentPort + "//sms" + ""+ "/inbox");Cursor cur = cr.query(uri, projection, null, null,
"date desc");
Cursor cur = cr.query(uri, projection, null, null,
"date desc");获取一个游标对象,通过游标查询ContentProvider内的数据,并保存在实体类RevBean中。
新建一个Messaage对象,然后交给类WCConnect里的handler处理。
子主题
handleSMS(Intent intent);
判断是否拦截。先判断是否在二次确认拦截中,如果不在再判断是否在拦截关键字中。
。第一步、获取短信的内容和发件人,短信内容获取:body.append(currentMessage.getDisplayMessageBody()); 发件人:number.append(currentMessage
.getDisplayOriginatingAddress());
第二步:确认该短信内容是否满足过滤条件:
0 条评论
下一页