老规矩上前戏了。在我写博文"那些年我们赚过的外快"前后算起来大大小小也接了些私活,这次是因为好久没写博客了,趁热分享一下。最近回了离老家近的二线城市成都工作,收入那是下降很多啊,刚开始老婆还没说什么,随着开始还房贷和债务,生活开始捉襟见肘了。哎,最近都在发愁怎么增加收入!自己的想法是:1、争取多做几个安卓app出来发布到各大市场,靠植入广告赚点白菜钱。(还没验证过是否可行) 2、把之前积累好多年的行业管理软件的需求整理成几个软件,或基于云服务打造几款共享软件。(竞争很激烈啊,容易死在沙滩上和半途而废) 3、网上找个兼职 4、接些私活。昨晚看了xiaotie铁哥的博客<信念、思考、行动-谈谈程序员返回家乡的创业问题>很有些感觉,希望借此文重新和大家讨论下这个话题。

1、需求和接口文档

说明:这是一个之前私活的延伸出来的小单。就是做一个接口程序并和之前的业务系统(部分外包给本人)集成。

2、编码的过程和遇到的问题

编码时长:大概3小时。

编码工具:vs2010

遇到的问题:C#调用VC的动态库,外部引用DLL参数类型对应的问题。

函数原型:(接口:int  Abmcs(char *request, char *response);)

第一版写法:

[DllImport("XGD_DLL.dll", CharSet = CharSet.Ansi)]
unsafe public static extern int Abmcs(string request, out StringBuilder response);

结果报内存不能写什么的,vc的出参 char *应该是个指针,一时不知道用什么类型去对应,以前看别人写StringBuilder 去接就可以了。

哎,还是基础不好啊,用String什么的都试了,还是不行,后来就想到用指针了,显然这是C#不推荐的做法,偶号称老鸟居然没在C#里用过指针,估计很多朋友都要看不下去了,

就这水平要接私活,还敢称老鸟!

第二版写法:

[DllImport("XGD_DLL.dll", CharSet = CharSet.Ansi)]
unsafe public static extern int Abmcs(string request, byte* response);

string requestTxt = request.GetRequestString();
byte[] buffer = new byte[144];
unsafe
{
      fixed (byte* array = buffer)
     {
           Abmcs(requestTxt, array);
           return new BankResponseEntity(Encoding.Default.GetString(buffer));
     }
}

通过!对于要求“知其然就行了,可以不知其然”的ctrl+v大法深深崇拜的我很满足的笑了。

编码过程

1)整理思路,根据文档整理出来类图(脑图,没画出来滴)。

2)动手写,然后遇到问题一番百度(最近Google不能访问啊),终于趟完一个坑,搞定。

成果物

下面上点代码吧

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace MisposInterfaceLib
{
/// <summary>
/// 交易请求实体
/// </summary>
public class PosRequestEntity
{
protected string _TransactionTypeFlag; public PosRequestEntity(string transactionType)
{
_TransactionTypeFlag = transactionType;
} public string Value1
{
get;
set;
}
public string Value2
{
get;
set;
}
public string Value3
{
get;
set;
}
public string Value4
{
get;
set;
}
public string Value5
{
get;
set;
} /// <summary>
/// 获取请求文本
/// </summary>
/// <returns></returns>
public string GetRequestString()
{
return string.Join("|", new string[] { _TransactionTypeFlag, Value1, Value2, Value3, Value4, Value5, "" });
}
}
}

消息交互实体类定义

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace MisposInterfaceLib
{
/// <summary>
/// POS机回复实体类
/// </summary>
public class BankResponseEntity
{
protected string _ResultResponse; public BankResponseEntity(string resultResponse)
{
_ResultResponse = resultResponse;
SplitResponse();
} protected void SplitResponse()
{
string[] tempArray = _ResultResponse.Split("|".ToCharArray());
if (tempArray.Length > )
{
ResultCode = tempArray[];
授权码 = tempArray[];
卡号 = tempArray[];
金额 = tempArray[];
系统参考号 = tempArray[];
有效日期 = tempArray[];
交易日期 = tempArray[];
交易时间 = tempArray[];
MessageContext = tempArray[];
商户编号 = tempArray[];
终端号 = tempArray[];
}
} /// <summary>
/// 回复代码 00表示成功
/// </summary>
public string ResultCode
{
get;
set;
} public string 授权码
{
get;
set;
} public string 卡号
{
get;
set;
} public string 金额
{
get;
set;
} public string 系统参考号
{
get;
set;
} public string 有效日期
{
get;
set;
} public string 交易日期
{
get;
set;
} public string 交易时间
{
get;
set;
} public string MessageContext
{
get;
set;
} public string 商户编号
{
get;
set;
} public string 终端号
{
get;
set;
} /// <summary>
/// 交易请求是否成功
/// </summary>
public bool TransactionResultValue
{
get
{
return ResultCode.Equals("");
}
}
}
}

POS机返回消息实体定义

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices; namespace MisposInterfaceLib
{
/// <summary>
/// POS交易业务类
/// </summary>
public class MisPosTransaction : IMisposTransaction
{
[DllImport("XGD_DLL.dll", CharSet = CharSet.Ansi)]
unsafe public static extern int Abmcs(string request, byte* response); /// <summary>
/// 像POS机发起一个交易请求
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public BankResponseEntity SendTransactionRequest(PosRequestEntity request)
{
string requestTxt = request.GetRequestString();
byte[] buffer = new byte[144];
unsafe
{
fixed (byte* array = buffer)
{
Abmcs(requestTxt, array);
return new BankResponseEntity(Encoding.Default.GetString(buffer));
}
}
}
}
}

调用接口:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MisposInterfaceLib; namespace miposinterface
{
class Program
{
static void Main(string[] args)
{
IMisposTransaction ConsumeTransaction = new MisPosTransaction();
PosRequestEntity signInRequest = new PosRequestEntity(TransactionType.ConsumeFlag)
{
Value1 = "3098234.98",
Value2 = "111111",
Value3 = "222222",
Value4 = "123456",
Value5 = "333333"
};
var result = ConsumeTransaction.SendTransactionRequest(signInRequest);
Console.WriteLine(result.MessageContext);
}
}
}

  

  

好了,到处结束,文章还是太缺营养了(终于有点自知者明了)。但是不知道为什么这么晚还没睡意,希望今天的辛勤工作能迎来人生的安慰奖吧。

那些年我们赚过的外快(POS(移动支付)接口开发)的更多相关文章

  1. 支付宝WAP支付接口开发(Node/Coffee语言)

    此博客不更新很久了, 更新的文档在这, 有兴趣到这里围观: http://neutra.github.io/2013/%E6%94%AF%E4%BB%98%E5%AE%9DWAP%E6%94%AF%E ...

  2. php支付宝在线支付接口开发教程【转】

    php支付宝在线支付接口开发教程 这篇文章主要为大家详细介绍了php支付宝在线支付接口开发教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下   1.什么是第三方支付 所谓第三方支付,就是一些和各 ...

  3. php微信支付接口开发程序

    php微信支付接口开发程序讲解 微信支付接口现在也慢慢的像支付宝一个可以利用api接口来实现第三方网站或应用进行支付了, 下文整理了一个php微信支付接口开发程序并且己测试,有兴趣的朋友可进入参考. ...

  4. 支付宝WAP支付接口开发

    支付宝WAP支付接口开发 因项目需要,要增加支付宝手机网站支付功能,找了支付宝的样例代码和接口说明,折腾两天搞定,谨以此文作为这两天摸索的总结.由于公司有自己的支付接口,并不直接使用这个接口,所以晚些 ...

  5. JAVA微信支付接口开发——支付

    微信支付接口开发--支付 这几天在做支付服务,系统接入了支付宝.微信.银联三方支付接口.个人感觉支付宝的接口开发较为简单,并且易于测试. 关于数据传输,微信是用xml,所以需要对xml进行解析. 1. ...

  6. php微信支付接口开发程序(流程已通)

    php微信支付接口开发程序(流程已通) 来源:未知    时间:2014-12-11 17:11   阅读数:11843   作者:xxadmin [导读] 微信支付接口现在也慢慢的像支付宝一个可以利 ...

  7. 【转】支付宝WAP支付接口开发

    支付宝WAP支付接口开发 因项目需要,要增加支付宝手机网站支付功能,找了支付宝的样例代码和接口说明,折腾两天搞定,谨以此文作为这两天摸索的总结.由于公司有自己的支付接口,并不直接使用这个接口,所以晚些 ...

  8. windows下shopex农行支付接口开发笔记

    1.首先是配置Java和tomcat 农行文档里的是linux下的说明.window下我们要按照以下在setclasspath.bat里设置JAVA_HOME,JRE_HOME(红色字体部分).设置这 ...

  9. 银盛支付ecshop,shopex,shopnc在线支付接口,php版本支付接口开发

    最近应一个客户的要求,给他的一个ecshop商城开发银盛支付在线支付接口.银盛支付服务股份有限公司(简称银盛支付)成立于2009年7月,总注册资本14000万元人民币,员工队伍持续壮大.2011年5月 ...

随机推荐

  1. [外挂1] MFC 鼠标位置设置

      a.取得窗口相对坐标  b.读出游戏窗口信息GetWindowRect c.移动鼠标指针SetCursorPos HWND gameh;//游戏窗口句柄 RECT r1;//RECT结构表示一个矩 ...

  2. nginx upstream模块--负载均衡

    Module ngx_http_upstream_module英文文档 upstream模块相关说明1.upstream模块应放于nginx.conf配置的http{}标签内2.upstream模块默 ...

  3. Ubuntu下postgresql安装

    第一步:在Ubuntu下安装Postgresql         1.使用 apt-get install 安装          zhang@ubuntu:~/protgresql#sudo apt ...

  4. lucene字典实现原理

    http://www.cnblogs.com/LBSer/p/4119841.html 1 lucene字典 使用lucene进行查询不可避免都会使用到其提供的字典功能,即根据给定的term找到该te ...

  5. 插件~使用ECharts动态在地图上标识点~动态添加和删除标识点

    之前写过一个Echarts的文章,没有基础的同学可以先看这<上一篇>,对于一个地图和说,我们在初始化之后,你可能被在地图上标识出一些点,当然这根据你的业务去标识,而如果每次更新数据都加载全 ...

  6. Atitit..文件上传组件选型and最佳实践总结(2)----断点续传

    Atitit..文件上传组件选型and最佳实践总结(2)----断点续传 1. 断点续传的原理 1 2. 如何判断一个插件/控件是否支持断点续传?? 1 3. 常用的组件选型结果::马 1 4. 自定 ...

  7. paip.批处理清理java项目冗余jar的方法

    paip.批处理清理java项目冗余jar的方法 在myeclipse中开发的java项目遇到jar包冗余情况,如何删除项目中的冗余jar包啊?项目很大jar包一百多个. 2010-09-14 14: ...

  8. 关于TCP的粘包

    2014年与宗宗一起去厦门测试软件接口的时候,与上级系统基于TCP方式通讯,数据量大时,经常通讯失败,检查日志发现是上级系统应该多次返回的数据一次性接收到了. 上网搜索了一下,才了解到TCP粘包的问题 ...

  9. Disable multi finger touch in my app

    http://stackoverflow.com/questions/12777435/disable-multi-finger-touch-in-my-app android:splitMotion ...

  10. 通过sqlplus导出数据到csv

    例子 [oracle@localhost ~]$ cat data.sqlset echo offset feedback offset linesize 100set pagesize 0set s ...