接口文档地址:公众号 霖深时见露
输入关键字,农行
<?php
/**
* Created by PhpStorm.
* User: 海峡
* Date: 2020/9/15
* Time: 10:19
*/
//include_once 'rsa.php';
$data = [];
$data['mch_id'] = '921010000000000';
$data['out_trade_no'] = '20200915123456';
$data['total_fee'] = '1';
$data['nonce_str']=md5(time());
$data['body'] = '测试商品';
$private_key_path='';
$public_key='';
$signData = rsa2($data,$private_key_path);
$data['sign'] = $signData;
$url='https://pay.echase.cn/abcpay/gateway/jspay';
$res = httpRequest($url,$data);
function httpRequest($url,$data)
{
$data = json_encode($data);
$headerArray =array("Content-type:application/json;charset='utf-8'","Accept:application/json");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
var_dump($output);
curl_close($ch);
}
/**
* 加密
* RSA签名
* @param $data 待签名数据
* @param $private_key_path 商户私钥文件路径
* return 签名结果
*/
function rsa2($data,$pikey){
//将请求的参数进行排序
ksort($data);//ksort()函数 根据参数的键进行升序排序
reset($data);
$signStr = '';
foreach ($data as $key => $value) {
if ($key == 'sign' || $value == '') continue;
$signStr .= $key .'=' .$value .'&';
}
$signStr = substr($signStr, 0, -1);
$pikey_res = "-----BEGIN RSA PRIVATE KEY-----\n" . wordwrap($pikey, 64, "\n", true) . "\n-----END RSA PRIVATE KEY-----";
$pi_key = openssl_pkey_get_private($pikey_res);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
if(!$pi_key) return'私钥有误';
openssl_sign($signStr,$sign,$pi_key,OPENSSL_ALGO_SHA256 );//私钥签名
//openssl_private_encrypt 加密数据
//openssl_sign 签名
//签名在什么场景下使用?作用是什么?
//配合一个 key 防止串改。
//单纯验证数据。(但是不需要知道原数据)
//核心是散列算法,即你可以从 A 得到一个 B ,但是几乎不可能从 B 逆向得到 A 。
//比如 "hello" 的 MD5 值是:5d41402abc4b2a76b9719d911017c592 。
//再比如我给你一个 MD5 值 a2891da3bb01b6b8406521b844ba1a20 ,这是 B ,你几乎不可能算出它是
//哪个字符中的 MD5 值。
$sign = base64_encode($sign);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
return $sign;
}
/**
* 解密
* RSA签名
* @param $data 待签名数据
* @param $private_key_path 商户私钥文件路径
* return 签名结果
*/
function RsaDecrypt($str,$public_key){
$pu_key = openssl_pkey_get_public($public_key);//这个函数可用来判断公钥是否是可用的
if(!$pu_key) return '公钥有误';
openssl_public_decrypt(base64_decode($str),$decrypted,$pu_key);//私钥加密的内容通过公钥可用解密出来
return $decrypted;
}