老规矩上前戏了。在我写博文"那些年我们赚过的外快"前后算起来大大小小也接了些私活,这次是因为好久没写博客了,趁热分享一下。最近回了离老家近的二线城市成都工作,收入那是下降很多啊,刚开始老婆还没说什么,随着开始还房贷和债务,生活开始捉襟见肘了。哎,最近都在发愁怎么增加收入!自己的想法是: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. 无线客户端框架设计(4):自定义生命周期的设计(iOS篇)

    首先要确定一点,我们的App,要基于XIB文件进行编程,而不是在每个相应的ViewController里面去手动创建页面的每个控件.这样做的好处是,将页面布局与业务逻辑彻底隔离.于是我们可以把xib的 ...

  2. AngularJs 基础(60分钟入门)

    AngularJS 是一个创建富客户端应用的JavaScript MVC框架.你仍然需要具有服务端后台,但大多数的用户交互逻辑将放到客户端上处理.它可以创建单页的应用程序,一个页面的应用仅仅需要HTM ...

  3. Lucene

    Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎. Lucene的目的是为软件开发人员提供一个简单易 ...

  4. create mystic by Django

    See the sumary below figure : We going to talk each step ...more detail

  5. java集合——题4,6

    4.(List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列. 例如: List list = new ArrayList(); list.add(“Hel ...

  6. MySql 分页

    MySql 分页 由于最近项目需要,于是就简单写了个分页查询.总体而言MySql 分页机制较为简单.数据库方面只需要使用limit即可实现分页.前后台交互就直接用session传了值. 下面就写写具体 ...

  7. C#下取得Exif中照片拍摄日期

    /// <summary> /// 获取Exif中的照片拍摄日期 /// </summary> /// <param name="fileName"& ...

  8. AD8275 Driver Amplifiers For Analog-To-Digital Converters

    Driver Amplifiers For Analog-To-Digital Converters What amplifiers are used to drive analog-to-digit ...

  9. HTML解析组件HtmlAgilityPack使用

    HtmlAgilityPack是一个开源的解析HTML元素的类库,最大的特点是可以通过XPath来解析HMTL,如果您以前用C#操作过XML,那么使用起HtmlAgilityPack也会得心应手.目前 ...

  10. android studio 乱码

    1. 设置 file- setting -file encodeing- 设置utf-8 2 .  build.gradle 添加 tasks.withType(JavaCompile) { opti ...