php hex加密解密函数使用例子
加密解密
//Hex(Hex(Md5((原文+密钥).getBytes(“utf-8”))).getBytes(“utf-8”))
function String2Hex($string){
$hex='';
for ($i=0; $i < strlen($string); $i++){
$hex .= dechex(ord($string[$i]));
}
return $hex;
}
function Hex2String($hex){
$string='';
for ($i=0; $i < strlen($hex)-1; $i+=2){
$string .= chr(hexdec($hex[$i].$hex[$i+1]));
}
return $string;
}
// example:
$hex = String2Hex("test sentence...");
$data = array(
'appId' => 'SHAN-GUO-CHI-BI',
'data' =>'{"appId":"SHAN-GUO-CHI-BI","cardNo":"6006012000000001"}',
'sig'=>'4331443139334331313645464642444544364334343742374236364335454243',
);
$key = '111111111111111111111111';
$data['sig'] = String2Hex(strtoupper(md5($data['data'] . $key)));
例子
PHP 转换输出字符串为 Hex Oct
通过下面代码,可以把PHP输出的字符串换行为16进制和8进制。
<?php
$str = "http://www.111cn.net";
$lixiphp = ”;
for($i = 0; $i < strlen($str); $i++) {
if ($i % 2 == 0) {
$lixiphp .= ‘\x’.base_convert(ord($str[$i]), 10, 16);
}
else {
$lixiphp .= ‘\\’.base_convert(ord($str[$i]), 10, 8);
}
}
echo $lixiphp;
?>
通过上述代码,把字符串 "http://www.111cn.net" 转换为"\x68\164\x74\160\x3a\57\x2f\142\x6c\157\x67\56\x6c\151\x78\151\x70\150\x70\56\x63\157\x6d"
PHP实现来基数位字符串转换十六进制,偶数位字符串转换为八进制。
下图是ASCII码表,可以简单的核对10进制、8进制和16进制与127常用字符的关系。
支付接口现在有第三方的支付接口也有银行的支付接口了,今天我们来介绍php版本银联支付接口开发实例了,这个我估计可以帮助到不少的朋友的哦。
银联支付,首先要注意二重要的部分:
PHP运行环境是5.4.18以上
开了扩展openss
开发手册上面的列子只做参考,因为基本都是错的。你可以试着去官网下一个demo。。。注意现在银联开发,没有测试密钥提供,只能在正式环境开发【20151219】
下面是我用ThinkPHP编写的一个支付类
/**
* 银联支付 v0.1
* @auther:Summer<dengwz7788@gmail.com>;
* @date:20151202
* **/
class NetPayAction extends BaseAction{
//在类初始化方法中,引入相关类库
public function _initialize() {
header("Content-type:text/html;charset=utf-8");
vendor('Netpay.util.common',"",".php"); //导入加密核心文件夹
vendor('Netpay.util.SecssUtil',"",".class.php"); //导入加密核心文件夹
vendor('Netpay.util.Settings_INI',"",".php"); //导入加密核心文件夹
vendor('Netpay.util.Settings',"",".php"); //导入加密核心文件夹
$this->securityPropFile= $_SERVER['DOCUMENT_ROOT'] . "/ThinkPHP/Extend/Vendor/Netpay/config/security.properties"; //谁知道这是啥,反正他们要我加的
$this->b2cPaySend = __APP__."/Index/NetPay/b2cPaySend";
$this->b2cRefundSend = __APP__."/Index/NetPay/b2cRefundSend";
$this->b2cQuerySend = __APP__."/Index/NetPay/b2cQuerySend";
$this->;MerBgUrl = __APP__."/Index/NetPay/MerBgUrl";
$this->MerPageUrl = __APP__."/Index/NetPay/MerPageUrl";
}
public function index()
{
$paramArray=array (
'MerId' => '商户号',
'MerOrderNo' => '0000001944663232',
'OrderAmt' => '1',
'TranDate' => '20151219',
'TranTime' =>'171248',
'TranType' => '0001',
'BusiType' =>'0001',
'Version' => '20140728',
'CurryNo' => 'CNY',
'AccessType' =>; '0',
'CommodityMsg' => '测试商品1号',
'MerPageUrl' => $this->MerBgUrl,
'MerBgUrl' =>$this->MerPageUrl,
'MerResv' => 'MerResv',
);
if (count($paramArray) >0) {
$dispatchUrl = $this->b2cPaySend;
$transResvedJson = array();
$cardInfoJson = array();
$sendMap = array();
foreach ($paramArray as $key => $value) {
if (isEmpty($value)) {
continue;
}
if (startWith($key, "trans_")) {
$key = substr($key, strlen("trans_"));
$transResvedJson[$key] = $value;
} else
if (startWith($key, "card_")) {
$key = substr($key, strlen("card_"));
$cardInfoJson[$key] = $value;
} else {
$sendMap[$key] = $value;
}
}
$transResvedStr = null;
$cardResvedStr = null;
if (count($transResvedJson) >0) {
$transResvedStr = json_encode($transResvedJson);
}
if (count($cardInfoJson) > 0) {
$cardResvedStr = json_encode($cardInfoJson);
}
$secssUtil = new SecssUtil();
if (! isEmpty($transResvedStr)) {
$transResvedStr = $secssUtil->decryptData($transResvedStr);
$sendMap["TranReserved"] = $transResvedStr;
}
if (! isEmpty($cardResvedStr)) {
$cardResvedStr = $secssUtil->decryptData($cardResvedStr);
$sendMap["card_"] = $cardResvedStr;
}
$securityPropFile = $this>securityPropFile;
$secssUtil->init($securityPropFile);
$secssUtil->sign($sendMap);
$sendMap["Signature"] = $secssUtil->getSign();
$_SESSION = $sendMap;
header("Location:" . $dispatchUrl);
}
}
public function b2cPaySend(){
layout(false);
$settings = new Settings_INI();
$settings->oad($this->securityPropFile);
$pay_url = "https://payment.chinapay.com/CTITS/service/rest/page/nref/000000000017/0/0/0/0/0";
$html = "<form name='payment' action='{$pay_url}' method='POST' target='_blank'>;";
$params = "TranReserved;MerId;MerOrderNo;OrderAmt;CurryNo;TranDate;SplitMethod;BusiType;MerPageUrl;MerBgUrl;SplitType;MerSplitMsg;PayTimeOut;MerResv;Version;BankInstNo;CommodityMsg;Signature;AccessType;AcqCode;OrderExpiryTime;TranType;RemoteAddr;Referred;TranTime;TimeStamp;CardTranData";
foreach ($_SESSION as $k =>$v) {
if (strstr($params, $k)) {
$html .= "<input type='hidden' name = '" . $k . "' value ='" . $v . "'/>";
}
}
$html .= "<nput type='button' type='hidden' value='提交订单' >";
$html .= "<;/from>";
$this->html = $html;
$this->display();
}
public function pgReturn(){
if ($_POST) {
if (count($_POST) > 0) {
$secssUtil = new SecssUtil();
$securityPropFile = $this>securityPropFile;
$secssUtil->init($securityPropFile);
$text = array();
foreach($_POST as $key=>$value){
$text[$key] = urldecode($value);
}
if ($secssUtil->verify($text)) {
//支付成功
$_SESSION["VERIFY_KEY"] = "success";
} else {
//支付失败
$_SESSION["VERIFY_KEY"] = "fail";
}
}
}
}
}
银联支付应该是算比较简单的!!
感觉银联的支付接口比支付宝的还简单好用了,当然每个考虑到的东西不一样哦,上面只是开个玩笑的哦
微信公众号服务号可以实现许多的功能如果我们要发红包那么必须要服务号了,否则无法实现此功能了,下面我们来看一篇关于php版的微信公众号接口发红包程序代码例子吧,具体的如下所示。- 微信商户号,已申请微信支付
- 微信商户号主体下面的微信公仔号
先看一下效果图
只需要完成后面几步就可以了。
在微信支付的服务器上面部署红包代码
在微信公众号服务器上面调用红包代码
/*
**微信红包功能
*/
public function sendredpack(){
$re_openid = $this->_pg('re_openid');
$inputObj = new sendredpack_pub();
if(!$re_openid){
return "微信红包功能,收红包用户不能为空";
}
$inputObj->setParameter('re_openid',$re_openid); //收红包的用户的openid
$inputObj->setParameter('send_name',"汽配一号铺"); //红包发送者名称
$inputObj->setParameter('total_amount',"100"); //收红包的用户的金额,精确到分
$inputObj->setParameter('total_num',"1"); //收红包的个数
$inputObj->setParameter('wishing',"恭喜发财,谢谢支持,小小心意"); //收红包的用户的openid
$inputObj->setParameter('client_ip',"121.40.157.243"); //调用接口的IP
$inputObj->setParameter('act_name',"小邓感恩红包"); //红包主题
$inputObj->setParameter('remark',"谢谢大家一路一来的支持"); //备注
$response = $inputObj->getResult();
return $response;
}
在微信支付辅助工具层加一个类,来完成红包功能
/**
* 微信发红包接口
**/
class sendredpack_pub extends Wxpay_client_pub
{
function __construct() {
//设置接口链接
$this->url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
//设置curl超时时间
$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
}
/**
* 生成接口参数xml
*/
function createXml()
{
try
{
$this->parameters["mch_billno"] = WxPayConf_pub::MCHID.createUnique();//商户订单号
$this->parameters["wxappid"] = WxPayConf_pub::APPID;//公众账号ID
$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
$this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
$this->parameters["sign"] = $this->getSign($this->parameters);//签名
return $this->arrayToXml($this->parameters);
}catch (SDKRuntimeException $e) {
die($e->errorMessage());
}
}
/**
* 作用:获取结果,使用证书通信
*/
function getResult()
{
$this->postXmlSSL();
$this->result = $this->xmlToArray($this->response);
return $this->result;
}
}
然后部署返微信支付的服务上面,就可以了!!然后在做微信公众号(这个公众号)的服务上面加入“红包”。就能达到上面的效果了
根据文档进行开发
请您仔细阅读接口文档,参照文档进行开发,请注意,为了保证商户资金安全,接口强校验商户号与appid之间的绑定关系,以及appid与openid之间的对应关系(如果商户号与appid之间没有绑定关系,即appid没有申请微信支付或者申请微信支付商户号不匹配,或者openid归属appid错误,接口会返回报错)
注意,要使用微信在第三方网页登录是需要“服务号”才可以哦,所以必须到官方申请。
一开始你需要进入微信公众平台开启开发模式,并且填写oauth2的回调地址,地址填写你项目的域名就可以了.比如:www.baidu.com或zhidao.baidu.com.如果你的项目在二级域名就写二级域名
前端url授权地址,在url中填写appid与你项目中方法中的oauth的地址,具体在下面的代码中可以看到.
<ahref="https://open.weixin.qq.com/connect/oauth2/authorize?appid=appid&redirect_uri=http://www.xxxxxx.com/action/function/oauth2&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect">授权</a>
再说后台逻辑,首先调用微信接口的SDK.(后面会有)
include('./Card/Common/class_weixin_adv.php');
之后填入微信官方给的的appid与secret
$weixin=new class_weixin_adv("appid", "secret");
初始化SDK的类,取到code,利用获取到的code在获取出openid 看下面代码注释!
$url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=appid&secret=secret&code=".$_GET['code']."&grant_type=authorization_code";
$res = $weixin->https_request($url);//调用SDK方法获取到res 从中可以得到openid
$res=(json_decode($res, true));//转换成array 方便调用openid
继续调用SDK方法,获取到用户信息.此时$row已经获得用户信息了 可以var_dump下看看键值方便存入数据库
$row=$weixin->get_user_info($res['openid']);
获取用户信息就大功告成了,但这还不够.我们需要的是无需注册!所以需要利用openid,openid属于唯一凭证,每个用户对不同的公众号都有不同的openid.可以理解成用户账号的感觉.我这里用的是把openid存入cookie的解决方案,类似用户登陆的感觉,一些关键数据验证只需要与数据库中的openid进行对比.其他的一些利用方法可以发挥大家的想象!可以跟我留言交流!
关于之前的a链接的授权,大家也可以判断cookie是否存在openid,从而让未授权用户直接跳转到该地址,省却了用户的一步操作.
下面是完整逻辑代码,大家可以参考下!
public function oauth2(){
include('./Card/Common/class_weixin_adv.php');
$weixin=new class_weixin_adv("appid", "secret");
if (isset($_GET['code'])){
$url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=appid&secret=secret&code=".$_GET['code']."&grant_type=authorization_code";
$res = $weixin->https_request($url);
$res=(json_decode($res, true));
$row=$weixin->get_user_info($res['openid']);
if ($row['openid']) {
//这里写上逻辑,存入cookie,数据库等操作
cookie('weixin',$row['openid'],25920);
}else{
$this->error('授权出错,请重新授权!');
}
}else{
echo "NO CODE";
}
$this->display();
}
SDK代码:微信官方有手册,我就不多讲了,自己研究,很简单的!.
<?php
/**
* 微信SDK
* pan041ymail@gmail.com
*/
class class_weixin_adv
{
var $appid = "";
var $appsecret = "";
//构造函数,获取Access Token
public function __construct($appid = NULL, $appsecret = NULL)
{
if($appid){
$this->appid = $appid;
}
if($appsecret){
$this->appsecret = $appsecret;
}
$this->lasttime = 1395049256;
$this->access_token = "nRZvVpDU7LxcSi7GnG2LrUcmKbAECzRf0NyDBwKlng4nMPf88d34pkzdNcvhqm4clidLGAS18cN1RTSK60p49zIZY4aO13sF-eqsCs0xjlbad-lKVskk8T7gALQ5dIrgXbQQ_TAesSasjJ210vIqTQ";
if (time() > ($this->lasttime + 7200)){
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->appsecret;
$res = $this->https_request($url);
$result = json_decode($res, true);
$this->access_token = $result["access_token"];
$this->lasttime = time();
}
}
//获取用户基本信息
public function get_user_info($openid)
{
$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$this->access_token."&openid=".$openid."&lang=zh_CN";
$res = $this->https_request($url);
return json_decode($res, true);
}
//https请求
public function https_request($url, $data = null)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if (!empty($data)){
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
}
相关文章
- eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
- 在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- 下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
- 这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
Android开发中findViewById()函数用法与简化
findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20- 这篇文章主要介绍了vue接口请求加密实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-12
- strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07- Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
- free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
- 关于AES加密的算法我们就不说了,这里主要给各位演示了三个关于AES算法实现的加密例子,希望本文章能给你带来帮助。 话不多说,先放上代码,一共有两个文件:AES.php(aes算...2016-11-25
- 这次文章要给大家介绍的是node.JS md5加密中文与php结果不一致怎么办,不知道具体解决办法的下面跟小编一起来看看。 因项目需要,需要Node.js与PHP做接口调用,发现nod...2017-07-06
- PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
- 分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30
SQL Server中row_number函数的常见用法示例详解
这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08