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

    随着微软日渐重视开源社区的贡献,微软在自己的产品中往往也会集成开源的第三方库. 比如System.Net.Http.Foramatting.dll 就依赖于Newtonsoft.json v4.5. ...

  2. C#课外实践——校园二手平台(心得篇)

    先声明一下,现在回头看一下自己做的小程序,感觉很不怎么地.但是通过这次的实践明白了很多的东西.至于程序实现的什么给你,通过名字就可以猜出来.不过,是客户端的.我想,这应该是我见过的第一个以客户端为模式 ...

  3. Redis教程(十):持久化详解

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/137.html 一.Redis提供了哪些持久化机制: 1). RDB持久化 ...

  4. yafphp框架

    学习资料 Yaf(Yet Another Framework)用户手册http://www.laruence.com/manual/index.html laruence/yafhttps://git ...

  5. Javascript构造函数与prototype

    构造函数 构造函数的缺点 prototype的引入 Prototype模式的验证方法 构造函数 在Javascript语言中,new命令后面跟的不是类,而是构造函数(constructor). 构造函 ...

  6. Js中的一个日期处理格式化函数

    由于在工作中,经常需要对日期进行格式化,不像后端那样,有方便的方法可调用,可以在date的对象prototype中定义一个format方法,见如下 //日期时间原型增加格式化方法 Date.proto ...

  7. ORM SQLOBJECT SIMPLE

    step01: (Install sqlobject) sudo easy_install sqlobject step02: (Connect MySQL) step03: (Install sup ...

  8. 从MySQL 5.5到5.7看复制的演进

    概要:MySQL 5.5 支持单线程模式复制,MySQL 5.6 支持库级别的并行复制,MySQL 5.7 支持事务级别并行复制.结合这个主线我们可以来分析一下MySQL以及社区发展的一个前因后果. ...

  9. Leetcode 67 Add Binary 大数加法+字符串处理

    题意:两个二进制数相加,大数加法的变形 大数加法流程: 1.倒置两个大数,这一步能使所有大数对齐 2.逐位相加,同时进位 3.倒置两个大数的和作为输出 class Solution { public: ...

  10. ECShop出现Strict Standards: Only variables should be passed by reference in的解决方法

    今天安装ecshop的时候最上面出现了一个错误提示:Strict Standards: Only variables should be passed by reference in F:\www.x ...