C#手机充值
C#手机充值系统开发(基于聚合数据)
说是手机充值系统有点装了,其实就是调用了聚合数据的支付接口,其实挺简单的事 但是我发现博客园竟然没有类似文章,我就个出头鸟把我的代码贡献出来吧
首先说准备工作:
去聚合数据申请账号-添加手机支付的认证-认证通过后为账户充值。
上述工作完成后,开始准备开发要用到的必要参数:
appid:在个人中心-我的数据中可找到对应的APPKEY(每个不同的接口都需要使用对应的appkey)
openid:个人中心-用户中心-账户信息(这个是唯一的程序中会使用到)
对应的接口都有比较详细的数据接收已经返回参数的说明,具体开发中会用到,具体的请查看链接:https://www.juhe.cn/docs/api/id/85
接下来要准备开发中的用到几个辅助函数,在对应的API文档中有示例代码,也可以使用下面的:
这几个函数具体的功能就不用说了 ,是代码很简单,都是网络链接发送请求和接受请求是时用的,我主要介绍的是点中未提供的一些
示例代码中用到了JsonObject这个类 代码中提供的是CSDN的链接,竟然还要2积分才能下载,坑爹啊 在这里我给大家分享出来吧 http://pan.baidu.com/s/1hsqF51y
在项目中应用DLL加入using Xfrog.Net;命名空间
准备工作结束
接下来就进入正式编码阶段了 ,开始前我准备说一下重点,其实接口的代码并不复杂,我想说了还是思路吧
1.验证当前账户余额是否够本次充值:调用 http://op.juhe.cn/ofpay/mobile/yue 具体参数参看:https://www.juhe.cn/docs/api/id/85
2.检测手机号是否可以充值:调用http://op.juhe.cn/ofpay/mobile/telcheck 具体参数参看:https://www.juhe.cn/docs/api/id/85/aid/213
3.调用手机直冲接口: http://op.juhe.cn/ofpay/mobile/onlineorder 具体参数参看: https://www.juhe.cn/docs/api/id/85/aid/214
4.调用订单查询接口:http://op.juhe.cn/ofpay/mobile/ordersta 具体参数参看:https://www.juhe.cn/docs/api/id/85/aid/586
5.编写回调处理页面:QQ上搜索聚合数据的客服,给他账号和回调地址后,让他帮助设置,具体的回调地址接受参数查看:http://code.juhe.cn/docs/detail/id/1565
具体代码贴出:
//1.账户余额查询
string url1 = "http://op.juhe.cn/ofpay/mobile/yue"; var parameters1 = new Dictionary<string, string>(); string timestamp = GetTimeStamp();
parameters1.Add("timestamp", timestamp); //当前时间戳,如:1432788379
parameters1.Add("key", appkey);//你申请的key
string signstr =openid+ appkey+timestamp;
parameters1.Add("sign", CommonManager.String.EncryptMD5SystemDefaultMethod(signstr, false, true)); //校验值,md5(<b>OpenID</b>+key+timestamp),OpenID在个人中心查询 string result1 = sendPost(url1, parameters1, "get"); JsonObject newObj1 = new JsonObject(result1);
String errorCode1 = newObj1["error_code"].Value; //查询余额是否成功
if (errorCode1 == "0")
{ //判断余额是否够本次充值
if (double.Parse(newObj1["result"]["money"].Value) > double.Parse(Integrals)) {
//msg.InnerText="余额充足!"; //5.检测手机号码是否能充值
string url5 = "http://op.juhe.cn/ofpay/mobile/telcheck"; var parameters5 = new Dictionary<string, string>(); parameters5.Add("phoneno", phone); //手机号码
parameters5.Add("cardnum", Integrals); //充值金额,目前可选:5、10、20、30、50、100、300
parameters5.Add("key", appkey);//你申请的key string result5 = sendPost(url5, parameters5, "get"); JsonObject newObj5 = new JsonObject(result5);
String errorCode5 = newObj5["error_code"].Value; if (errorCode5 == "0")
{
//可以充值
//7.手机直充接口
string url7 = "http://op.juhe.cn/ofpay/mobile/onlineorder"; var parameters7 = new Dictionary<string, string>();
parameters7.Add("phoneno", phone); //手机号码
parameters7.Add("cardnum", Integrals); //充值金额,目前可选:5、10、20、30、50、100、300
parameters7.Add("orderid", orderstr); //商家订单号,8-32位字母数字组合
parameters7.Add("key", appkey);//你申请的key
string md5str = openid + appkey + phone + Integrals + orderstr;
parameters7.Add("sign", CommonManager.String.EncryptMD5SystemDefaultMethod(md5str, false, true)); //校验值,md5(<b>OpenID</b>+key+phoneno+cardnum+orderid),OpenID在个人中心查询 string result7 = sendPost(url7, parameters7, "get"); JsonObject newObj7 = new JsonObject(result7);
String errorCode7 = newObj7["error_code"].Value; if (errorCode7 == "0")
{
msg.InnerText = "充值订单创建成功,等待商户充值后查看订单状态!"; DbSession.Default.FromSql(
@"UPDATE TOP(1) TPropLog SET Jhorderid=@Jhorderid,PropStatus=@PropStatus WHERE ID = @ID")
.AddInputParameter("@ID", DbType.Int32, id)
.AddInputParameter("@PropStatus", DbType.Int32, 3)
.AddInputParameter("@Jhorderid", DbType.String, newObj7["result"]["sporder_id"].Value)
.Execute();
status.SelectedValue = "3";
}
else
{
msg.InnerText = "充值订单失败!失败原因:" + newObj7["reason"].Value;
} }
else
{
msg.InnerText = "手机号不能充值!原因:" + newObj1["reason"].Value;
} }
else
{
msg.InnerText = "余额不足请充值!当前账户余额为:" + newObj1["result"]["money"].Value;
} }
else
{
msg.InnerText="余额查询失败!"; }
里面有几个点注意一下:
1.需要sign签名的几个接口需要按照格式使用MD5进行一个转换,MD5转换的函数网上一大把相信你的项目中也有了我就不提供了 ,按照他提供的格式组织签名就行了
2.我的订单查询接口是写在另外一个函数里的,因为我的逻辑充值后单独可以查询,可根据情况自行更改。
3.回调页面是POST方式传值,所以接受的时候按照他提供的参数接收就行了,根据返回的订单号跟新本地数据
//聚合话费充值回调页面,页面的设置需要联系聚合客服更改
protected void Page_Load(object sender, EventArgs e)
{ var sporder_id = CommonManager.Web.Request("sporder_id", "");//聚合订单ID
var orderid = CommonManager.Web.Request("orderid", ""); //鼎鼎订单ID
var sta = CommonManager.Web.Request("sta", ""); //充值状态1:成功 9:失败
if (sta == "1")
{
//更新订单状态为充值成功
DbSession.Default.FromSql(
@"UPDATE TOP(1) TPropLog SET PropStatus=@PropStatus WHERE Jhorderid = @Jhorderid")
.AddInputParameter("@PropStatus", DbType.Int32, 4)
.AddInputParameter("@Jhorderid", DbType.String, sporder_id)
.Execute();
Response.Clear();
Response.Write("success");
Response.End();
}
if (sta == "9")
{
//更新订单状态为充值成功
DbSession.Default.FromSql(
@"UPDATE TOP(1) TPropLog SET PropStatus=@PropStatus WHERE Jhorderid = @Jhorderid")
.AddInputParameter("@PropStatus", DbType.Int32, 5)
.AddInputParameter("@Jhorderid", DbType.String, sporder_id)
.Execute();
Response.Clear();
Response.Write("success");
Response.End();
//更新订单状态为充值失败
} }
重点回顾:
1.JsonObject.DLL下载
2.签名顺序和字符要按照提供的做
3.回调地址要找客服设置
4.单个手机号每天有充值数量和次数的限制,超过次数会导致订单一直提示进行中,最后失败,失败也会有回调提示的
5.测试的时候可以将vs自带的iis调试工具配合ngrok映射到外网,这样直接就可以调试回调页面,改天我会写一个简单的教程,如何使用vs默认的iis映射到外网进行调试(微信的外网调试也可以这么做,非常方便哦)
C#手机充值的更多相关文章
- WePY 在手机充值小程序中的应用与实践
wepyjs 发布了两个月了,中间经历了很多版本更新,也慢慢开始有一些用户选择 wepyjs 作为开发框架来开发小程序,比如一些线上小程序. 以及一些来自网上的 wepyjs 的相关资源: demo源 ...
- C#手机充值系统开发(基于聚合数据)
说是手机充值系统有点装了,其实就是调用了聚合数据的支付接口,其实挺简单的事 但是我发现博客园竟然没有类似文章,我就个出头鸟把我的代码贡献出来吧 首先说准备工作: 去聚合数据申请账号-添加手机支付的认证 ...
- 几个功能强大的系统源码(机票分销、机票预订、OA、手机充值、wifi营销、网络超市、体检平台)
1.机票分销.机票预订系统源码 2.OA系统源码 3.手机在线充值系统源码 4.wifi营销系统源码 5.网络超市系统源码 6.在线体检平台系统源码 7.违章查询与缴费系统源码 需要的同学请联系QQ: ...
- 淘宝UWP中的100个为什么
从淘宝UWP第一版发布到现在,已经有十个月了,期间收到了用户各种各样的反馈,感谢这些用户的反馈,指导我们不断的修正.完善应用.但是也有一部分需求或建议,由于资源或技术的限制,目前确实无法做到,只能对广 ...
- 【腾讯Bugly干货分享】打造“微信小程序”组件化开发框架
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/2nQzsuqq7Avgs8wsRizUhw 作者:Gc ...
- ime-mode:disabled 关闭文本框输入法
在用户输入数字的表单中,需要禁止用户输入中文.符号等,减少用户输入出错误的可能性,CSS可以实现此功能. ime-mode的语法解释如下: ime-mode : auto | active | ina ...
- 一些稍微复杂点的sql语句
UPDATE test SET content = REPLACE(content,'国家级',''),content = REPLACE(content,'世界级',''),content = RE ...
- GridView实现方块布局
效果如下: 先创建一个BaseViewHolder package com.example.griddemo; import android.util.SparseArray; import andr ...
- HTML初步入门
标签元素 标签介绍 html元素包括一个或一对标签定义的包含范围.而标签就是由两个字符串"<"和">"号组成,标签包括开始标签"<& ...
随机推荐
- 关于虚拟机装kali-linux的联网问题
我用的是VMware Workstation11,近期装了一个kali-linux,想玩一下password破解.没想到装上之后网络连接显示的是活跃的却无法上网,我试过桥接等其他方式去联网,却依然无法 ...
- 一个可无限伸缩且无ABA问题的无锁队列
关于无锁队列,详细的介绍请参考陈硕先生的<无锁队列的实现>一文.然进一步,如何实现一个不限node数目即能够无限伸缩的无锁队列,即是本文的要旨. 无锁队列有两种实现形式,分别是数组与链表. ...
- 想买一套arduino玩玩
对于物联网,去年才接触,认识但不熟悉.做过一个项目,买了一块树莓派,看了一段网络电视. 最近被邀分享一些关于物联网的东西,翻了些大学公开课,很系统但太偏理论和框架.听了一个TED感觉很不错,但太精简. ...
- BZOJ 1491: [NOI2007]社交网络( floyd )
floyd...求最短路时顺便求出路径数. 时间复杂度O(N^3) ------------------------------------------------------------------ ...
- C++学习之函数指针
C++学习之函数指针 和数据项类似,函数也有地址,函数的地址是存储在机器语言代码的内存的开始地址.通常,这些地址对用户而言,不重要也没什么用处,但对程序而言,它却很有用. 一.函数 ...
- 全局变量,extern和static以及命名空间的区别
全局变量,extern和static以及命名空间的区别 全局变量只是在声明它的文件中有效,假如在另一个文件中声明定义了一个相同名称的全局变量,则在后续使用这两个变量的时候会产生名字上的冲 ...
- codeforces 245H . Queries for Number of Palindromes 区间dp
题目链接 给一个字符串, q个询问, 每次询问求出[l, r]里有多少个回文串. 区间dp, dp[l][r]表示[l, r]内有多少个回文串. dp[l][r] = dp[l+1][r]+dp[l] ...
- MySQL学习系列一---命令行连接mysql和执行sql文件
1.命令行连接mysql #mysql -h(主机) -u(用户名) -p (数据库名) mysql -hlocalhost -uroot -p testdb Enter password: **** ...
- spring与hibernate整合配置基于Annotation注解方式管理实务
1.配置数据源 数据库连接基本信息存放到properties文件中,因此先加载properties文件 <!-- jdbc连接信息 --> <context:property-pla ...
- 关于 rand() 函数返回值的值域的疑问
<C语言参考手册>中关于 rand() 函数有如下描述. (1)rand() 函数的原型 int rand(void); (2)连续调用 rand 将返回 0 到 int 类型的最大可表示 ...