支付宝调用方法
public function alipay($out_trade_no,$total_amount){
$pri_key =私钥;//手动更改
$arr = [
'app_id' => APPID,//手动更改
'method' => 'alipay.trade.wap.pay',
'return_url' => 'http://open.luomengyuan.cn/return_state',
'charset' => 'utf-8',
'sign_type' => 'RSA2',
'timestamp' => date('Y-m-d H:i:s'),
'version' => '1.0',
'notify_url' => 'http://open.luomengyuan.cn/notify_state',
'biz_content' => '',
];
$arr_param = [
'subject' => '测试',
'out_trade_no' => $out_trade_no,//订单号
'total_amount' => $total_amount,//商品总金额
'product_code' => 'QUICK_WAP_WAY',
];
//转换json格式
$arr['biz_content'] = json_encode($arr_param,JSON_UNESCAPED_UNICODE);
//按键排序
ksort($arr);
//拼接url参数
$str = urldecode(http_build_query($arr));
$rsa = new \RSA();
//生成签名
$arr['sign'] = $rsa->rsaSign($str, $pri_key);
//请求支付宝
header('location:https://openapi.alipaydev.com/gateway.do?' . http_build_query($arr));
}
异步回调方法代码
/**
* 支付宝异步返回
*/
public function notify_state(){
$pub_key =支付宝公钥;
//获取支付宝发送的数据
$params = $_POST;
//测试是否能走通
//file_put_contents('./test.php', print_r($params,true) . "\r\n",FILE_APPEND);
$sign = $params['sign'];
//除去sign、sign_type
unset($params['sign']);
unset($params['sign_type']);
//排序
ksort($params);
//拼接字符串
$str = urldecode(http_build_query($params));
//使用公钥验签
$rsa = new \RSA();
$stat = $rsa->rsaCheck($str, $pub_key, $sign);
if($stat){
//判断支付状态
if($params['trade_status'] == 'TRADE_SUCCESS' || $params['trade_status'] == 'TRADE_FINISHED'){
$data = DB::table('order')->where('order_number',$params['out_trade_no'])->first();
//根据订单号 判断订单金额是否一致
if($data->sum_price == $params['total_amount']){
//update order stat 更新订单状态
$res = DB::table('order')->where('order_number',$params['out_trade_no'])->where('status',1)->update(['status'=>2]);
if($res > 0){
echo 'success';
}
}
}
}
}
RSA类
<?php
class RSA
{
/**
* RSA签名
* @param $data 待签名数据
* @param $private_key 私钥字符串
* return 签名结果
*/
function rsaSign($data, $private_key) {
$search = [
"-----BEGIN RSA PRIVATE KEY-----",
"-----END RSA PRIVATE KEY-----",
"\n",
"\r",
"\r\n"
];
$private_key=str_replace($search,"",$private_key);
$private_key=$search[0] . PHP_EOL . wordwrap($private_key, 64, "\n", true) . PHP_EOL . $search[1];
$res=openssl_get_privatekey($private_key);
if($res)
{
openssl_sign($data, $sign,$res,OPENSSL_ALGO_SHA256);
openssl_free_key($res);
}else {
exit("私钥格式有误");
}
$sign = base64_encode($sign);
return $sign;
}
/**
* RSA验签
* @param $data 待签名数据
* @param $public_key 公钥字符串
* @param $sign 要校对的的签名结果
* return 验证结果
*/
function rsaCheck($data, $public_key, $sign) {
$search = [
"-----BEGIN PUBLIC KEY-----",
"-----END PUBLIC KEY-----",
"\n",
"\r",
"\r\n"
];
$public_key=str_replace($search,"",$public_key);
$public_key=$search[0] . PHP_EOL . wordwrap($public_key, 64, "\n", true) . PHP_EOL . $search[1];
$res=openssl_get_publickey($public_key);
if($res)
{
$result = (bool)openssl_verify($data, base64_decode($sign), $res,OPENSSL_ALGO_SHA256);
openssl_free_key($res);
}else{
exit("公钥格式有误!");
}
return $result;
}
}