PHP调用内容DES加密的SOAP接口

2024-04-30 00:08

本文主要是介绍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向量使用固定值。

复制代码
 1 /* 
 2      方倍工作室
 3      http://www.fangbei.org
 4 */
 5 
 6 class DES
 7 {
 8     var $key;
 9     var $iv;
10 
11     function DES($key)
12     {
13         $this->key = $key;
14         $bytes = array(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
15         $this->iv =  $this->bytesToStr($bytes);
16         // $this->iv =  mcrypt_create_iv ( mcrypt_get_block_size (MCRYPT_DES, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM );
17     }
18 
19     //加密,返回大写十六进制字符串
20     function encrypt($str) 
21     {
22         $size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC );
23         $str = $this->pkcs5Pad ( $str, $size );
24         return strtoupper( bin2hex( mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv ) ) );
25     }
26 
27     //解密
28     function decrypt($str) 
29     {
30         $strBin = $this->hex2bin( strtolower( $str ) );
31         $str = mcrypt_cbc( MCRYPT_DES, $this->key, $strBin, MCRYPT_DECRYPT, $this->iv );
32         $str = $this->pkcs5Unpad( $str );
33         return $str;
34     }
35 
36     function hex2bin($hexData) 
37     {
38         $binData = "";
39         for($i = 0; $i < strlen ( $hexData ); $i += 2) {
40             $binData .= chr ( hexdec ( substr ( $hexData, $i, 2 ) ) );
41         }
42         return $binData;
43     }
44 
45     function pkcs5Pad($text, $blocksize) 
46     {
47         $pad = $blocksize - (strlen ( $text ) % $blocksize);
48         return $text . str_repeat ( chr ( $pad ), $pad );
49     }
50 
51     function pkcs5Unpad($text) 
52     {
53         $pad = ord ( $text {strlen ( $text ) - 1} );
54         if ($pad > strlen ( $text ))
55             return false;
56         if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad)
57             return false;
58         return substr ( $text, 0, - 1 * $pad );
59     }
60 
61     function bytesToStr($bytes)
62     {
63         $str = '';
64         foreach($bytes as $ch) {
65             $str .= chr($ch);
66         }
67         return $str;
68     }
69 }
复制代码

 

四、准备入参

首先需要获得当前订单号,订单号为20160322185825271格式。

实现代码如下

1 list($millisecond, $second)=explode(' ',microtime());
2 $timestamp = date("YmdHis",$second);
3 $orderno = $timestamp.substr($millisecond, 2, 3);

然后调用DES进行加密

1 $crypt = new DES($desKey);
2 $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协议接口

调用方法如下

复制代码
1 try {
2     $client = new SoapClient('http://www.fangbei.org/VoucherService.asmx?WSDL');
3     $result = $client->GetVoucher(array('XmlParam'=>$XMLParam, 'UserName'=>$UserName,'Sign'=>$Sign));
4     var_dump($result);
5     $encryptVoucherResult = $result->GetVoucherResult;
6 } catch (SOAPFault $e) {
7     print_r('Exception:'.$e);
8 }
复制代码

result结果如下

复制代码
object(stdClass)#2 (1) {["GetVoucherResult"]=>string(464) "6F036F920E11B1069FC97B5A7CBF5BBB77B58B63980251864C75ECB3D7D34E453B88D50B32B3330F9415B5B54FF03DB082EB5CA9C8C5CCE0664A030BC1BB1541E297B0983E06FDEFCF772F14DA4A0B70F395562BA31BDAED0CA0978680825BA810E8B40FAB24E73562CC782DB897193553FF3724BF86E9863134B9CEA25635D2BCF435B33936896C4E0C257E8CC77D6E017DA4782FE6058CEBABD832EE33E47878B305D89647F8D119C33C24181CCC1A610C286E312B77FF9E02D4077A0C303902DC185D3915BE4BC493661F8212AB98C325C46E242357E7D15A5033956A43F8C651374590D4727F"
}
复制代码

有用的内容为加密的

6F036F920E11B1069FC97B5A7CBF5BBB77B58B63980251864C75ECB3D7D34E453B88D50B32B3330F9415B5B54FF03DB082EB5CA9C8C5CCE0664A030BC1BB1541E297B0983E06FDEFCF772F14DA4A0B70F395562BA31BDAED0CA0978680825BA810E8B40FAB24E73562CC782DB897193553FF3724BF86E9863134B9CEA25635D2BCF435B33936896C4E0C257E8CC77D6E017DA4782FE6058CEBABD832EE33E47878B305D89647F8D119C33C24181CCC1A610C286E312B77FF9E02D4077A0C303902DC185D3915BE4BC493661F8212AB98C325C46E242357E7D15A5033956A43F8C651374590D4727F

对其进行DES解密

1 $decryptVoucherResult = $crypt->decrypt($encryptVoucherResult);
2 var_dump($decryptVoucherResult);

返回内容为XML

<Result><status>1</status><uuid>A5C0CFAE06644038AA53A50DF6CD159C</uuid><extractcode></extractcode><datamatrix>zwH3FAtTwhP7h2zWSe65q7qWdoWqzph5nZ/XUBJP89N/rYIn14k+WxDL+ukchZvKXHdCxs6r6YCBoTIcgW0hgIHg4ULu9C6p</datamatrix></Result>

再将XML转成PHP数组,代码如下

1 $obj = json_decode(json_encode(simplexml_load_string($decryptVoucherResult)),TRUE);
2 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接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/947510

相关文章

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Python如何调用另一个类的方法和属性

《Python如何调用另一个类的方法和属性》在Python面向对象编程中,类与类之间的交互是非常常见的场景,本文将详细介绍在Python中一个类如何调用另一个类的方法和属性,大家可以根据需要进行选择... 目录一、前言二、基本调用方式通过实例化调用通过类继承调用三、高级调用方式通过组合方式调用通过类方法/静

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

Linux从文件中提取特定内容的实用技巧分享

《Linux从文件中提取特定内容的实用技巧分享》在日常数据处理和配置文件管理中,我们经常需要从大型文件中提取特定内容,本文介绍的提取特定行技术正是这些高级操作的基础,以提取含有1的简单需求为例,我们可... 目录引言1、方法一:使用 grep 命令1.1 grep 命令基础1.2 命令详解1.3 高级用法2