PHP调用内容DES加密的SOAP接口
本文以方倍工作室优惠券接口开发为例,介绍PHP下DES加解密及SOAP接口调用的实现过程。
一、基础概念
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。
DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。 明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。
SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分:SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例; SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。
WSDL(Web Service Description Language)就是描述XML Web服务的标准XML格式,WSDL由Ariba、Intel、IBM和微软等开发商提出。它用一种和具体语言无关的抽象方式定义了给定Web服务收发的有关操作和消息。就其定义来说,你还不能把WSDL当作一种对象接口定义语言,例如,CORBA或COM等应用程序体系结构就会用到对象接口定义语言。 WSDL保持协议中立,但它确实内建了绑定SOAP的支持,从而同SOAP建立了不可分割的联系。所以,当我在这篇文章中讨论WSDL的时候,我会假定你把SOAP作为了你的通讯协议。
SOAP和WSDL虽然是web service的两大标准,但是两者并没有必然的联系,都可以独立使用。它们之间的关系就类似HTTP和Html之间的关系。前者是一种协议,后者是对一个Web Server的描述。
二、PHP下的配置
在php的的配置文件php.ini中,找到
extension=php_soap.dll
然后将前面的;号去掉,然后重启web服务
探针查看环境,需要支持mcrypt和soap



三、DES加解密
Des的类如下,其中iv向量使用固定值。
/*
方倍工作室
http://www.fangbei.org
*/ class DES
{
var $key;
var $iv; function DES($key)
{
$this->key = $key;
$bytes = array(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
$this->iv = $this->bytesToStr($bytes);
// $this->iv = mcrypt_create_iv ( mcrypt_get_block_size (MCRYPT_DES, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM );
} //加密,返回大写十六进制字符串
function encrypt($str)
{
$size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC );
$str = $this->pkcs5Pad ( $str, $size );
return strtoupper( bin2hex( mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv ) ) );
} //解密
function decrypt($str)
{
$strBin = $this->hex2bin( strtolower( $str ) );
$str = mcrypt_cbc( MCRYPT_DES, $this->key, $strBin, MCRYPT_DECRYPT, $this->iv );
$str = $this->pkcs5Unpad( $str );
return $str;
} function hex2bin($hexData)
{
$binData = "";
for($i = 0; $i < strlen ( $hexData ); $i += 2) {
$binData .= chr ( hexdec ( substr ( $hexData, $i, 2 ) ) );
}
return $binData;
} function pkcs5Pad($text, $blocksize)
{
$pad = $blocksize - (strlen ( $text ) % $blocksize);
return $text . str_repeat ( chr ( $pad ), $pad );
} function pkcs5Unpad($text)
{
$pad = ord ( $text {strlen ( $text ) - 1} );
if ($pad > strlen ( $text ))
return false;
if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad)
return false;
return substr ( $text, 0, - 1 * $pad );
} function bytesToStr($bytes)
{
$str = '';
foreach($bytes as $ch) {
$str .= chr($ch);
}
return $str;
}
}
四、准备入参
首先需要获得当前订单号,订单号为20160322185825271格式。
实现代码如下
list($millisecond, $second)=explode(' ',microtime());
$timestamp = date("YmdHis",$second);
$orderno = $timestamp.substr($millisecond, 2, 3);
然后调用DES进行加密
$crypt = new DES($desKey);
$XMLParam = $crypt->encrypt($XMLData);
明文为
<GetVoucher><machinecode>000000000</machinecode><vtype>VTRMB</vtype><data>10</data><validdays>30</validdays><totalmoney>10</totalmoney><ordercode>20160322185825271</ordercode></GetVoucher>
加密后为
13FDFAF455E7A5516829F73FA6017EC55F54385CD3F15EC0C09FA429F30450504494B024CFA659DCD44A752A84421CDC8010C0B9C1C1B7F027AF1B24F138C08132DF05A923529478B1824BC7533B3A7A2F37F4CA76A8D52E820F6E491A801F9A0B13A69B6ABB4B092143751A7258A4D3935CDD8175091E7F6FE4F3F3964438117621F22B5133681C517C9D4DABE551C323D0D6DB5D563631AD0910D5C51E4DD46133C4FEE3AEC95DFD212F1A70546F7468C1A21168B024CDEA27A097157D08D7
五、PHP调用SOAP协议接口
调用方法如下
try {
$client = new SoapClient('http://www.fangbei.org/VoucherService.asmx?WSDL');
$result = $client->GetVoucher(array('XmlParam'=>$XMLParam, 'UserName'=>$UserName,'Sign'=>$Sign));
var_dump($result);
$encryptVoucherResult = $result->GetVoucherResult;
} catch (SOAPFault $e) {
print_r('Exception:'.$e);
}
result结果如下
object(stdClass)#2 (1) {
["GetVoucherResult"]=>
string(464) "6F036F920E11B1069FC97B5A7CBF5BBB77B58B63980251864C75ECB3D7D34E453B88D50B32B3330F9415B5B54FF03DB082EB5CA9C8C5CCE0664A030BC1BB1541E297B0983E06FDEFCF772F14DA4A0B70F395562BA31BDAED0CA0978680825BA810E8B40FAB24E73562CC782DB897193553FF3724BF86E9863134B9CEA25635D2BCF435B33936896C4E0C257E8CC77D6E017DA4782FE6058CEBABD832EE33E47878B305D89647F8D119C33C24181CCC1A610C286E312B77FF9E02D4077A0C303902DC185D3915BE4BC493661F8212AB98C325C46E242357E7D15A5033956A43F8C651374590D4727F"
}
有用的内容为加密的
6F036F920E11B1069FC97B5A7CBF5BBB77B58B63980251864C75ECB3D7D34E453B88D50B32B3330F9415B5B54FF03DB082EB5CA9C8C5CCE0664A030BC1BB1541E297B0983E06FDEFCF772F14DA4A0B70F395562BA31BDAED0CA0978680825BA810E8B40FAB24E73562CC782DB897193553FF3724BF86E9863134B9CEA25635D2BCF435B33936896C4E0C257E8CC77D6E017DA4782FE6058CEBABD832EE33E47878B305D89647F8D119C33C24181CCC1A610C286E312B77FF9E02D4077A0C303902DC185D3915BE4BC493661F8212AB98C325C46E242357E7D15A5033956A43F8C651374590D4727F
对其进行DES解密
$decryptVoucherResult = $crypt->decrypt($encryptVoucherResult);
var_dump($decryptVoucherResult);
返回内容为XML
<Result><status>1</status><uuid>A5C0CFAE06644038AA53A50DF6CD159C</uuid><extractcode></extractcode><datamatrix>zwH3FAtTwhP7h2zWSe65q7qWdoWqzph5nZ/XUBJP89N/rYIn14k+WxDL+ukchZvKXHdCxs6r6YCBoTIcgW0hgIHg4ULu9C6p</datamatrix></Result>
再将XML转成PHP数组,代码如下
$obj = json_decode(json_encode(simplexml_load_string($decryptVoucherResult)),TRUE);
var_dump($obj);
返回数组如下
array(4) {
["status"]=>
string(1) "1"
["uuid"]=>
string(32) "A5C0CFAE06644038AA53A50DF6CD159C"
["extractcode"]=>
array(0) {}
["datamatrix"]=>
string(96) "zwH3FAtTwhP7h2zWSe65q7qWdoWqzph5nZ/XUBJP89N/rYIn14k+WxDL+ukchZvKXHdCxs6r6YCBoTIcgW0hgIHg4ULu9C6p"
}
PHP调用内容DES加密的SOAP接口的更多相关文章
- 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码
详解C#泛型(二) 一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...
- 关于 php 调用 其他语言写的Web Service SOAP 接口的参数传递问题
关于 php 调用 其他语言写的Web Service SOAP 接口的参数传递问题,有需要的朋友可以参考下. php调用java写的soap接口经验: 场景一: java是以数组的形式接收参数的 ...
- 记一次.net core调用SOAP接口遇到的问题
背景 最近需要将一些外部的Web Service及其他SOAP接口的调用移到一个独立的WebAPI项目中,然后供其他.Net Core项目调用.之前的几个Web Service已经成功迁 ...
- C++调用openssl实现DES加密解密cbc模式 zeropadding填充方式 pkcs5padding填充方式 pkcs7padding填充方式
============================================== des cbc 加密 zeropadding填充方式 ======================= ...
- 对称加密----AES和DES加密、解密
目前主流的加密方式有:(对称加密)AES.DES (非对称加密)RSA.DSA 调用AES/DES加密算法包最精要的就是下面两句话: Cipher cipher = Cipher.get ...
- DES加密系统的实现
这是一个高内聚低耦合可复用的DES加密系统的实现. Github 链接:https://github.com/cyendra/CyDES 要实现加密系统,先考虑数据的基本单位. 在DES加密中,数据是 ...
- C++ 使用openssl库实现 DES 加密——CBC模式 && RSA加密——公加私解——私加公解
之前工作上需要用C++把软件生成的用户序列号用des加密cbc的模式,加密后为二进制,转化为十六进制,然后提供给java写的授权码管理平台. java平台会根据用户序列号,生成一个授权码,授权码是用r ...
- Des 加密cbc模式 padding
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using Syst ...
- 使用WebService发布soap接口,并实现客户端的https验证
什么是https HTTPS其实是有两部分组成:HTTP + SSL / TLS, 也就是在HTTP上又加了一层处理加密信息的模块,并且会进行身份的验证. 如何进行身份验证? 首先我们要明白什么是对称 ...
随机推荐
- [转] linux 下查看一个进程运行路径的方法
http://blog.csdn.net/brioxu/article/details/5104736 在linux下查看进程大家都会想到用 ps -ef|grep XXX ps -aux | hea ...
- Tomcat目录结构及Tomcat Server处理一个http请求的过程
http://blog.sina.com.cn/s/blog_62cb15980101jh9x.html 1.Tomcat的结构概述 Tomcat服务器是由一系列可配置的组件构成,其核心组件是 ...
- React 开发注意事项,注意点
react优势: 仅仅只要表达出你的应用程序在任一个时间点应该长的样子,然后当底层的数据变了,React 会自动处理所有用户界面的更新. 数据变化后,React 概念上与点击“刷新”按钮类似,但仅会更 ...
- 【bzoj1455】罗马游戏 可并堆
2016-05-31 10:04:41 可并堆的裸题. 左偏树(小根堆为例 性质 1.满足堆的性质,每个节点权值小于左右儿子权值 2.每个节点有dis值,表示子树最浅的叶子深度加1 3.左子树dis ...
- wego微购RSS、Sitemap、Ping、腾讯拍拍网购采集插件
和哥们研究淘宝客,找到微购这个程序觉得挺不错的,但是地图和RSS功能不是特别完善,于是小憩一下,做了下初级的拓展,分享给大家,开源精神嘛,大家也可以去我的网站我要购物平台去看看. 1.拓展后台seoA ...
- jQ处理页面中尺寸过大的图片
这是一个非常实用的功能,在网页里难免会出现一些尺寸过大的图片,会将页面撑开或者图片被部分隐藏,我们通常会用css的max-width来加以 控制,但ie6却不吃这套.我在做一个站时,就遇到这种困惑,因 ...
- [LintCode] Segment Tree Build 建立线段树
The structure of Segment Tree is a binary tree which each node has two attributes start and end deno ...
- Struts2中的Action类(解耦方式,耦合方式)
一.解耦方式 特点:对web资源进行了封装,便于单元测试. 实现:ActionContext和接口方式 1.ActionContext 特点:Action执行的上下文对象.保存了执行Action所需要 ...
- Odoo attrs X2many 类型的过滤
有童鞋在群里问到 attrs 中的 many2many类型的字段该如何进行domain过滤,其实非常简单: Many2many的字段在js中获取的值的格式为[[6,false,[]]] 所以attrs ...
- 内网网段划分ciso交换机配置
内网3750交换机配置: vlan 192 192.168.101.0/24 端口: 1--8vlan 10 10.10.10.0/24 端口: 9--16vlan 172 172.16.172.2/ ...