- 他有这样一个JS PassGuardCtrl.js 部分代码
1 defaults:{
2 obj:null,
3 random:null,//随机因子数
4 hidPwdName:‘password‘,//隐藏密码框名字,用来保存加密后的密码值
5 outInputClass:‘‘,//要把密码输入框写到的位置
6 params:{//附加属性,可选
7 pgePath: "./ocx/",//控件文件目录
8 pgeId: "_ocx_password",//控件ID
9 pgeEdittype: 0,//控件类型,0星号,1明文
10 pgeEreg1: "[\\s\\S]*",//输入过程中字符类型限制
11 pgeEreg2: "[\\s\\S]{6,50}", //输入完毕后字符类型判断条件
12 pgeMaxlength: 50,//允许最大输入长度
13 pgeTabindex: 2,//tab键顺序
14 pgeClass: "ocx_style",//控件css样式
15 pgeInstallClass: "ocx_style",//针对安装或升级
16 pgeOnkeydown:"FormSubmit()",//回车键响应函数
17 tabCallback:"_ocx_password2"
18 }
这段 js 就是对密码控件初始化.后台我在后面会把它改成 C#的
_setRandom:function(){
if(null==this.settings.random){
alert("error:random is empty");
return false;
}
this.object.pwdSetSk(this.settings.random);
return true;
} }
pwdSetSk: function(s) {
if (this.checkInstall()) {
try {
var control = document.getElementById(this.settings.pgeId);
if (this.osBrowser==1 || this.osBrowser==3 || this.osBrowser==6 || this.osBrowser==8) {
control.input1=s;
} else if (this.osBrowser==2 || this.osBrowser==4 || this.osBrowser==5) {
control.input(1,s);
}
} catch (err) {
}
}
这个js文件是设置安全控件的 随机因子 操作的是 安全控件的 input1
pwdResult: function() {
var code = ‘‘;
if (!this.checkInstall()) {
code = ‘‘;
}
else{
try {
var control = document.getElementById(this.settings.pgeId);
if (this.osBrowser==1 || this.osBrowser==3) {
code = control.output1;
} else if (this.osBrowser==2 || this.osBrowser==4 || this.osBrowser==5) {
code = control.output(7);
}else if (this.osBrowser==6 || this.osBrowser==8) {
code = control.get_output1();
}
} catch (err) {
code = ‘‘;
}
}
//alert(code);
return code;
},
这个文件是我们的主角,就是当我们在安全控件中输入内容后,自动的将我们的密码加密.但是加出的密码并不是提交的那个密文,还要进行一次 BASE64加密
function setPwdVal(clazz){
var _$=jQuery;
_$("input."+clazz).each(function(i,n){
var _objId = _$(n).attr("objId");
var _code = null;
var control = _$("#"+_objId)[0];
_code=window["PassGuardCtrl"+control.id.split("-")[0].toLocaleLowerCase()].pwdResult();
//_code = Base64.encoder(_code);
_code=BASE64.encoder(_code);
_$(n).val(_code);
});
}
在这这个方法中可以看到,使用了一次 BASE64加密,
经过上面这几个步骤后.可以将我们的密码加密成和提交时候的一样,
VS中添加安全控件, 大家可能都用过,基本的是 首先在工具栏右键->选择项->COM组件->选择对应的组件,OK了
但是很不幸 当你把控件拖入到界面上的时候,你的VS就崩了,我用vs2005,vs2008 vs2010 vs2013 都崩没找到好的办法,只能自己手动来创建,这个估计要点功点了.
我估计这是控件的安全性引起VS崩溃的吧,以前做支机支付辅助也一样VS也会崩,发现这个控件其实是同一个,只是只不同的名称,(应该是 电信和移动的项目外包到同一家公司了,呵呵)
现在把密码和加密码方式的核心代码段贴上,
public static String GetPayPass(AxPassGuardCtrlLib.AxPassGuard paypwd, String random) {
paypwd.input1 = random;
paypwd.edittype = 0;
paypwd.maxlength = 50;
paypwd.input2 = "[\\s\\S]*";//输入过程中字符类型限制
paypwd.input13 = "[\\s\\S]{6,50}";
String strPwd = paypwd.output1;
paypwd.ClearSeCtrl();
return EncodeBase64(strPwd);
}
这个random 随机因子大你登陆的那个页上可以找到
注意哦,这个并不是不变的,每次好像都是不一样的当你刷新页面的时候,所有我们要登陆首页先请求下登陆面把这个随机因子获取出来
下面是我的登陆部分方法.
internal void Login() {
String Result = "";
net.Url = "https://b.bestpay.com.cn/bppf/login.do?method=login";
net.Method = NetHelper.RequestMethod.GET;
net.IsStream = false;
Result = net.SendRequest();
if (Result.StartsWith("-1")) { LastError = "无法连接服务器"; return; }
String random = Utils.GetValue(Result, "pwdSetSk\\(\"", "\"");
Utils.SetPassword(PassGuard, LoginPass);
net.Url = "https://b.bestpay.com.cn/bppf/vimage.do?0." + Utils.GetUnixTime();
net.Referer = "https://b.bestpay.com.cn/bppf/login.do?method=login";
net.IsStream = true;
net.Method = NetHelper.RequestMethod.GET;
net.SendRequest();
if (net.IOStream == null) { LastError = "获取验证码失败"; return; }
Bitmap bmp = new Bitmap(net.IOStream);
String chkCode = Captcha.GetCheckString(bmp);
//检测验证码
net.Url = "https://b.bestpay.com.cn/bppf/verifyCode";
net.PostData = "verifyCode=" + chkCode;
net.IsStream = false;
net.Method = NetHelper.RequestMethod.POST;
Result = net.SendRequest();
if (Result.StartsWith("-1") || Result != "true") { LastError = "无法连接服务器"; return; }
String LoginPwd = Utils.GetPayPass(PassGuard, random);
net.Url = "https://b.bestpay.com.cn/bppf/login.do";
net.PostData = "signature=&certSN=&toURL=&TOURL_MENUID=&sysLoginType=BPPF&username=" + MerchantId + "&password=" + LoginPwd + "&method=login&verifyCode=" + chkCode;
net.Method = NetHelper.RequestMethod.POST;
net.Encode = "gbk";
net.IsStream = false;
Result = net.SendRequest();
LastError = Result;
if (Result.Contains("商户ID:" + MerchantId)) {
IsLogin = true;
dAmt0 = Convert.ToDecimal(Utils.GetValue(Result, "账户余额:<span class=\"property-amount\">", "</span>"));
dAmt1 = Convert.ToDecimal(Utils.GetValue(Result, "可用余额:<span class=\"property-amount\">", "</span>"));
dAmt2 = Convert.ToDecimal(Utils.GetValue(Result, "酬金余额:<span class=\"property-amount\">", "</span>"));
dAmt3 = Convert.ToDecimal(Utils.GetValue(Result, "冻结金额:<span class=\"property-amount\">", "</span>"));
}
}
手机充值下单方法
internal Boolean MobilePay(Order order, ref String msg) {
Boolean isSuccess = false;
for (int i = 0; i < 3; i++) {
String Result = "";
net.Url = "https://b.bestpay.com.cn/bppf/ipos/mobilerecharge.do?method=process";
net.Method = NetHelper.RequestMethod.POST;
net.PostData = "mobile=" + order.Account + "&otherMoney=" + order.Price + "&moneyText=";
net.IsStream = false;
Result = net.SendRequest();
if (Result.StartsWith("-1")) { continue; }
if (!Result.Contains("请您核对好运营商信息、充值号码和金额,避免充错")) { continue; }
String random = Utils.GetValue(Result, "pwdSetSk\\(\"", "\"");
String token = Utils.GetValue(Result, "\"org.apache\\.struts\\.taglib\\.html\\.TOKEN\"", "type");
token = Utils.GetValue(Result, "value=\"", "\"").Trim();
String phone = Utils.GetValue(Result, "name=\"phone\" value=\"", "\"").Trim();
String money = Utils.GetValue(Result, "name=\"money\" value=\"", "\"").Trim();
String txnAmount = Utils.GetValue(Result, "name=\"txnAmount\" value=\"", "\"").Trim();
String poundage = Utils.GetValue(Result, "name=\"poundage\" value=\"", "\"").Trim();
Utils.SetPassword(PassGuard, PayPass);
if (order.Account != phone) {
msg = "充值帐号袚篡改"; return false;
}
if (order.Price != money) {
msg = "充值金额袚篡改"; return false;
}
String PayPwd = Utils.GetPayPass(PassGuard, random);
net.Url = "https://b.bestpay.com.cn/bppf/ipos/mobilerecharge.do?method=checkPayPwd&payPwd=" + PayPwd;
net.Method = NetHelper.RequestMethod.POST;
net.PostData = "";
net.IsStream = false;
Result = net.SendRequest();
Log.Write(Result, "debut.txt");
net.Url = "https://b.bestpay.com.cn/bppf/ipos/mobilerecharge.do?method=confirm";
net.Method = NetHelper.RequestMethod.POST;
net.PostData = String.Format("org.apache.struts.taglib.html.TOKEN={0}&phone={1}&money={2}&txnAmount={3}£age={4}&receivePhone={5}&payPwd={6}", token, phone, money, txnAmount, poundage, phone, PayPwd);
Log.Write(net.PostData,"debug.txt");
net.IsStream = false;
Result = net.SendRequest();
if(Result.Contains("充值成功")){
msg = "缴费下单成功";
return true;
}
msg = Utils.GetValue(Result, "充值失败原因:</span><span class=\"title\" style=\"color: red;\">", "</span>");
Log.Write(Result, "debut.txt");
}
return isSuccess;
}
C# 实现对接电信交费易自动缴费
时间: 2024-10-11 10:37:13
C# 实现对接电信交费易自动缴费的相关文章
C# 实现对接电信交费易自动缴费 续(winio/winring0 自动填密码)
自动填密码大家可能都不莫生,最有名的应该是 按键精灵 只要是一个可以输入的地方都可以能过按键精灵来完成输入.我今天要讲的是使用 winio/winring0来完成类似的功能 如果要自动填充密码方式基本上有 消息级的模拟 和 驱动级的模拟, 消息级的模拟如 C# 直接使用 SendKeys 就可以完成 API下可以使用 SendMessage完成 即有了这个神器为什么还要用三方? 答案:现在一些网都使用了ActiveX安全插件,如网银,支付宝,等,还有我们上一次说到的 翼支付和手机支付 它们基本上
成为最有价值的汽车网站,易车还差点什么
日前,国内大数据服务提供商"缔元信?网络数据"发布<垂直网站转型及价值评估研究>报告.报告根据网站发展的新阶段,摒弃了传统的以浏览量.访问用户.浏览时长等为核心指标的网站价值评估体系,首次提出涵盖精准用户数.转化用户数.交易用户数三大指标的垂直网站价值评估新标准.新标准的推出符合网站发展到更高级阶段的新形势,更加科学.合理. 报告中,汽车网站易车与旅游网站携程.房产网站搜房一起,被缔元信援引为新标准下网站价值的典范.依据新标准的三项指标,汽车网站的精准用户数即查询报价用户数
500万已备好,亿万级会员红利也已开放
一卡易重磅推出的[会员+]开放平台将于7月1日正式启动,日前正在接受合作伙伴开发者奖励申请.我们已备好500万,放胆来拿! 十年磨一剑 今朝显锋芒 在互联网的冲击下,残酷的倒闭潮可谓一浪接一浪,而绝大多数的商家不是固守线下,就是盲目崇拜线上,无数的事实证明实体企业/商户只有将线上线下完美融合,两条腿走路才能实现真正的互联网+. 一卡易,作为业内唯一一家线上线下无缝打通的会员营销系统提供商,已深耕会员经济10年,拥有多个研发专利,在业内赢得了极高的品牌认可.尤其2016年以来,随着自助买单.小票红
Java多线程编程模式实战指南(二):Immutable Object模式--转载
本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-immutable-object.转载请注明作者: 黄文海 出处:http://viscent.iteye.com. 多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线程安
浅谈WebService的调用<;转>;
0.前言 前段时间,公司和电信有个合作,产品对接电信的某个平台,使用了WebService接口的调用,实现了业务受理以及单点登录.终于使用到了WebService,楼主还是比较兴奋的,目前功能已经上线,下面进行使用总结.WebService涉及到内容还是比较多的,涉及到发布和调用,有不少知识点,本文只是最简单的调用. 1.WebService简介 WebService是基于soap协议(简单对象访问协议全写为Simple Object Access Protocol)的,所有的webServic
Java多线程编程模式实战指南(二):Immutable Object模式
多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线程安全,又能避免引入锁可能带来的问题和开销. Immutable Object模式简介 多线程环境中,一个对象常常会被多个线程共享.这种情况下,如果存在多个线程并发地修改该对象的状态或者一个线程读取该对象的状态而另外一个线程试图修改该对象的状态,我们不得不做一些同步访问控制以保证数据一致性.而这些同
.NET RSA解密、签名、验签
using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; namespace API.Tools { /// <summary> /// 类名:RSAFromPkcs8 /// 功能:RSA解密.签名.验签 /
Immutable Object模式
多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线程安全,又能避免引入锁可能带来的问题和开销. Immutable Object模式简介 多线程环境中,一个对象常常会被多个线程共享.这种情况下,如果存在多个线程并发地修改该对象的状态或者一个线程读取该对象的状态而另外一个线程试图修改该对象的状态,我们不得不做一些同步访问控制以保证数据一致性.而这些同
不要再包通话套餐啦,免费电话已经势在必行
继"双11"晚微信推出智能通讯增强软件微信电话本后,26日,网易和电信联合推出了全免费无流量的通话软件易信3.0版本. 网络环境下免费通话软件很早就已经出现,但是由于一定要在网络环境下使用比较鸡肋,因此也一直是小打小闹不温不火,深挖其原因,还是因为通话双方都要下载软件,且在技术上通话也有延迟和回音. 双11晚,似乎是为了挽救光棍们手上的心灵,通话清晰无延迟的微信电话本热闹问世,支持网络条件下的免费通话及在对方无法接通情况下将音频转向语音信箱,在腾讯的热推之下,立即就引起了各界的热议.距