验签类RSA.php

<?php
namespace App\Library;

class RSA{
    /**
     * RSA签名
     * @param $data 待签名数据
     * @param $private_key 私钥字符串
     * return 签名结果
     */
    function rsaSign($data, $private_key,$type = 'RSA') {

$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)
            {
                if($type == 'RSA'){
                    openssl_sign($data, $sign,$res);
                }elseif($type == 'RSA2'){
                    //OPENSSL_ALGO_SHA256
                    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,$type = 'RSA')  {
            $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)
            {
                if($type == 'RSA'){
                    $result = (bool)openssl_verify($data, base64_decode($sign), $res);
                }elseif($type == 'RSA2'){
                    $result = (bool)openssl_verify($data, base64_decode($sign), $res,OPENSSL_ALGO_SHA256);
                }
                    openssl_free_key($res);
            }else{
                    exit("公钥格式有误!");
            }
            return $result;
    }
}

?>

基础类Alipay.php

<?php
namespace App\Library;

class Alipay extends RSA{
    /**
     * 以下信息需要根据自己实际情况修改
     */
    const PID = '123456787293293730';//'支付宝后台获取 合作伙伴ID'
    const PAYGAGEWAY = 'https://mapi.alipay.com/gateway.do';
    const CHECKURL = 'https://mapi.alipay.com/gateway.do?service=notify_verify&partner=' . self::PID . '&notify_id=';
    const APPPRIKEY = '3445dsdsddBAQEFAASCBKcwggSjAgEAAoIBAQCAB34dJEFmNnJ8MWmSTuse1s1LWiNPoDrO3HrA1acuFPcDlsT44W9cm56sBdsewewewenjwOOlpbkFg8eUSvrJ8WqD7P9icdhA2BVAw4hh//HiJv+Mml2dH1QjkCMgVp3QiVAlCW0pHCeiDYGPrd4Pn/nIlboQFk6pOSZnZLfkg/rKfk3J7m7C8irsjWWA2Vp77KBP7xxG9TJNo1uNWj+AtZnGCaGsDp2lhyNHAutXv4+z8ezH2MhTrpofAgvlw8Xzr35G3SgKXA6aHTOyj/wHZGbaIfzyn2x9NrkTUFlTz8JgWpR0SEirRWxV4F0DoW2o/B+ti86kwwN6CqJC7itXAgMBAAECggEAZcWO+ptXYWjmmNKumR8ix+D4UG3Wo/U6yjV5XtB3lKoVsUSoTy7k1zjdaOJbC3RG3eZV3jX2wDZ8XWXjwH3Z3a2KflRmrlrRDLq4KkNEpqJOJPfbLGmJAN1mhN6PDaXMzXhZvRdBLuyylJ8n3o7XdpQ0er6KqT8SSHKllIr7oyoktPH5SoVuNHRN2U38X0RU2odZmJ+IFzBAH1AFIaz4S54LltAo0/FXNA36a2/m6Se708a5BT1F7GKAwT78nOacoJNhlzJHKXY78KTSBQE1Pi4njjjeCNwZ3YJX5ionQmKOQI37ExrFvNp57vKMtK4SBCMFhi06fLFP/7P46vIQAQKBgQDMokZAghaIGYDZJ3tW4ynuxnfJUyl4rElbZ8loqUuh5loC3rDimUTmb4xn5dykE+qNJSdlSLr2yI+LAUVM8mj+RAzxbFFF9rCeb+l4OvRD9HbAAoAkR7nguLKDrcoelsOgF1aliuI5ZcnXM93oK2BUmTYM6mlHdX0RJSZ9QLFXpwKBgQCgKp+bw8LdklCZuPufD9gMlEuy+koyHdqVuHwMv/VUDBh82vHoaNTTVO6NftGWtZuXBaiANFBlx+9ZKV/64eJcF8/TuHux0pTs1C8Ac2zjKbZt77BpA0yHtek2xR8COYoqSiJ1+4g3ubAmEcBu/bR8MhuRncZgnDAvGmAXpeEE0QKBgBZ2cbO/E+4YrpYnyVg+U2oMizWkVVcTwnGwMOG2Q8Ef4h2SiGQ3YuLQt97n0pKIRST9QRfTJgLU/TzLBOpvaasPmUQfGcTOUZDyw/QYtJuJCEgHfj19SiAq5h2iRB+beRnntfEyD6cxTzi6Ts+fg1GGB/LfAHOBqBrrsw/ovA7dAoGBAIyOez0t4Y+ivHr63E5tkBMR/RCXF4+9pTqpCKwDtV7Jsp+3YH2tqb/AFA02UuXogB9bhtDjl/6KI+DiL2my23woJWlOx7Z479qaJplFsjP0QjVeGDk//ORH3t8CxECmkDqmjnFtiNAmc5AlGfQNT1uCebEjfZkA2EQt6FA4cS1RAoGAdU4hbkhtA2AnueaYQR6uGFBbfbFhxVdvt6ZgbPIV40cvGksVJTT78e8vkCm+i7+gHR3bkIVTLEHuNugy4mCbvtWJ8LW4c/B/llsjT8NZedCCLfbpy3X4VaAd6LvuJ1F7dmRr8zSaoD3ruz2cCW+QdWYlNmNO7B8jojUs+YmUSlk=';//应用私钥
    const APPID = '12121212680043';//应用APPID;
    const NEW_ALIPUBKE = 'dfdserrgfdfdesre45qGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89L6BkRAFljhNhgPdyPuBV64bfQNN1PjbCzkIM6qRdKBoLPXmKKMiFYnkd6rAoprih3/PrQEB/VsW8OoM8fxn67UDYuyBTqA23MML9q1+ilIZwBC2AQ2UBVOrFXfFl75p6/B5KsiNG9zpgmLCUYuLkxpLQIDAQAB';//支付宝公钥
    const NEW_PAYGATEWAY = 'https://openapi.alipay.com/gateway.do';

public function getStr($arr,$type = 'RSA'){
        //筛选  
        if(isset($arr['sign'])){
            unset($arr['sign']);
        }
        if(isset($arr['sign_type']) && $type == 'RSA'){
            unset($arr['sign_type']);
        }
        //排序  
        ksort($arr);
        //拼接
       return  $this->getUrl($arr,false);
    }
    //将数组转换为url格式的字符串
    public function getUrl($arr,$encode = true){
       if($encode){
            return http_build_query($arr);
       }else{
            return urldecode(http_build_query($arr));
       }
    }
    //获取签名MD5
    public function getSign($arr){
       return  md5($this->getStr($arr) . self::KEY );
    }
    //获取含有签名的数组MD5
    public function setSign($arr){
        $arr['sign'] = $this->getSign($arr);
        return $arr;
    }
    //获取签名RSA
    public function getRsaSign($arr){
       return $this->rsaSign($this->getStr($arr), self::APPPRIKEY) ;
    }
    //获取含有签名的数组RSA
    public function setRsaSign($arr){
        $arr['sign'] = $this->getRsaSign($arr);
        return $arr;
    }
    //获取签名RSA2
    public function getRsa2Sign($arr){
       return $this->rsaSign($this->getStr($arr,'RSA2'), self::APPPRIKEY,'RSA2') ;
    }
    //获取含有签名的数组RSA
    public function setRsa2Sign($arr){
        $arr['sign'] = $this->getRsa2Sign($arr);
        return $arr;
    }
    //记录日志
    public function logs($filename,$data){
        file_put_contents('/www/paylog/'.$filename, $data . "\r\n",FILE_APPEND);
    }
    //2.验证签名
    public function checkSign($arr){
        $sign = $this->getSign($arr);
        if($sign == $arr['sign']){
            return true;
        }else{
            return false;
        }
    }
     
    //验证是否来之支付宝的通知
    public function isAlipay($arr){
        $str = file_get_contents(self::CHECKURL . $arr['notify_id']);
        if($str == 'true'){
            return true;
        }else{
            return false;
        }
    }
    // 4.验证交易状态
    public function checkOrderStatus($arr){
        if($arr['trade_status'] == 'TRADE_SUCCESS' || $arr['trade_status'] == 'TRADE_FINISHED'){
            return true;
        } else {
            return false;
        }
    }
}

?>

项目中生成支付二维码接口

/*发起支付宝支付请求
    @author tjg
    @param string order_no        订单号
    @param string user_id         用户id
    @param string total_amount    订单金额(单位:分)
    @param string desc            订单描述
    @return json
   */
    public function sendAliPay($param=''){
        if(!empty($param['total_amount'])){
            $total_amount=$param['total_amount']/100;
        }else{
            $total_amount=0.01;
        }
        if(!empty($param['desc'])){
            $subject=$param['desc'];
        }else{
            $subject='新版支付宝支付';
        }
    $order_no=$param['order_no'];//订单号
    $user_id=$param['user_id'];//用户id
    $order_money=$total_amount;//订单金额
        $Alipay=new Alipay();
        //公共参数
        $pub_params = [
            'app_id'    => config('auth.alipay.APP_ID'),
            'method'    =>  'alipay.trade.page.pay', //接口名称 应填写固定值alipay.trade.page.pay
            'format'    =>  'JSON', //目前仅支持JSON
            // 'return_url'    => Env('APP_URL').'/fontend/pay/sendAliRE', //同步返回地址
            'charset'    =>  'UTF-8',
            'sign_type'    =>  'RSA2',//签名方式
            'sign'    =>  '', //签名
            'timestamp'    => date('Y-m-d H:i:s'), //发送时间 格式0000-00-00 00:00:00
            'version'    =>  '1.0', //固定为1.0
            'notify_url'    => Env('APP_URL').'/fontend/pay/sendAliNO', //异步通知地址
            'biz_content'    =>  '', //业务请求参数的集合
        ];
        $passback_params=UrlEncode('order_no='.$order_no.'&user_id='.$user_id.'&order_money='.$order_money);
        //业务参数
        $api_params = [
            'out_trade_no'  => date('YmdHis'),//商户订单号
            'product_code'  => 'FAST_INSTANT_TRADE_PAY', //销售产品码 固定值
            'total_amount'  =>$total_amount, //总价 单位为元
            'subject'  => $subject, //订单标题
            'qr_pay_mode'=>4,
            'passback_params'=>$passback_params,
        ];
        $pub_params['biz_content'] = json_encode($api_params,JSON_UNESCAPED_UNICODE);
        
      $pub_params =  $Alipay->setRsa2Sign($pub_params);
      //支付二维码地址
       $url = config('auth.alipay.NEW_PAYGATEWAY') . '?' . $Alipay->getUrl($pub_params);
       if(!empty($url)){
               $data['alipay_code']=$url;
       }else{
               $data['alipay_code']='';
       }
       return json_encode(['code'=>0,'msg'=>'请求成功','data'=>$data]);
    }

异步回调处理数据库

/*支付宝异步通知地址
    @author tjg
    @return json
   */
    public function sendAliNO($result=''){
        $Alipay=new Alipay();
        $resultDecode=urldecode($result);
        parse_str($resultDecode,$arr);
        $json_return=json_encode($arr);
      $passback_params=$arr['passback_params'];
      $passback_params_arr=explode('&',$passback_params);
      $order_no=$passback_params_arr[0];
        $order_no_arr=explode('=',$order_no);
        //平台订单号
        $order_no_val=$order_no_arr[1];
        $user_id=$passback_params_arr[1];
        $user_id_arr=explode('=',$user_id);
        //用户id
        $user_id_val=$user_id_arr[1];
        $order_money=$passback_params_arr[2];
        $order_money_arr=explode('=',$order_money);
        $order_money_val=$order_money_arr[1];
        //支付金额(单位:分)
        $paid_amount=$order_money_val*100;
        //支付类型
        $pay_type='ALI_PAY';
      //判断是否支付成功
      if($arr['trade_status']=='TRADE_SUCCESS'){
        $addTrade['trade_no']=$arr['out_trade_no'];
        $addTrade['pay_id']=2;
        $addTrade['subject']='购买商品';
        $addTrade['body']='购买商品';
        $addTrade['price']=$paid_amount;
        $addTrade['pay_amount']=$arr['total_amount']*100;
        $addTrade['receipt_amount']=$arr['total_amount']*100;
        $addTrade['trade_status']=1;
        $addTrade['pay_time']=date('Y-m-d H:i:s',time());
        $addTrade['create_at']=date('Y-m-d H:i:s',time());
        $addTrade['row_data']=$result;
        $addTrade['order_no']=$order_no_val;
        DB::table('info_pay_trade')->insert($addTrade);
        $strsuccess=date('Y-m-d H:i:s',time()).'异步通知结果写入时间'.$json_return;
        $filename='alipaysuccess.txt';
        $Alipay->logs($filename,$strsuccess);
        $ret = OrderService::payFinished($order_no_val,$user_id_val,$paid_amount, $pay_type);
        echo "success";
      }else{
        $addTrade['trade_no']=$arr['out_trade_no'];
        $addTrade['pay_id']=2;
        $addTrade['subject']='购买商品';
        $addTrade['body']='购买商品';
        $addTrade['price']=$order_money_val;
        $addTrade['pay_amount']=$arr['total_amount']*100;
        $addTrade['receipt_amount']=$arr['total_amount']*100;
        $addTrade['trade_status']=2;
        $addTrade['pay_time']=date('Y-m-d H:i:s',time());
        $addTrade['create_at']=date('Y-m-d H:i:s',time());
        $addTrade['row_data']=$result;
        DB::table('info_pay_trade')->insert($addTrade);
        $strfail=date('Y-m-d H:i:s',time()).'异步通知结果写入时间'.$json_return;
        $filename='alipayfail.txt';
        $Alipay->logs($filename,$strfail);
        echo "success";
      }
        
    }

pc端生成支付宝支付二维码相关推荐

  1. PC端生成小程序二维码海报并下载

    我采用了前端截屏+前端生成二维码的方法展示海报并下载 上代码 //截屏组件 import html2canvas from 'html2canvas' //生成二维码组件 import QRCode ...

  2. 用qrcode生成微信支付二维码

    项目场景: 用qrcode生成微信支付二维码 问题描述 根据后台返回的路径动态生成微信二维码 在这里我们用的是qrcodejs2,它有官网文档 npm i qrcodejs2 导入: import Q ...

  3. PC端调用摄像头扫描二维码,拿到二维码信息

    PC端调用摄像头扫描二维码,拿到二维码信息 <template><el-dialogtitle="扫描设备二维码":visible.sync="dial ...

  4. Java利用HttpClient发送请求生成微信支付二维码、查询支付状态

    一.HttpClient工具类 import org.apache.http.Consts; import org.apache.http.HttpEntity; import org.apache. ...

  5. 支付宝支付二维码显示在商家网站页面,不跳转到支付宝?

    如何控制二维码显示在商家电脑网站页面?根据官方文档说明,是可以实现的. 以下段落摘自支付宝官方文档 电脑网站支付本身是调用接口跳转到支付宝收银台页面显示二维码和账户登录方式支付的. 如果需要将该二维码 ...

  6. 免签接口 个人二维码收款系统/微信支付支付宝支付二维码监听自动发货/个人免签系统/个人免签支付 微信.支付宝 个人支付监控

    开源个人收款码免签系统 服务端和监控端全部开源,自建支付平台,安全更放心,二开更方便 没有中间商赚差价,买家扫多少,商家收多少 一.系统特色 1.1 支持 支付宝个人收款的推送通知 支付宝商家二维码的 ...

  7. XPosed插件自动生成支付宝收款二维码

    一.前言 前一段时间才偶然看到这个论坛,并且看了一篇@jiangwei212 大神的<Android支付宝蚂蚁森林能量自动收取插件开发原理解析>,这才知道XPosed和VirtualXPo ...

  8. vue3 前端pc生成微信支付二维码

    总体思路:后端会把二维码地址返回给前端. 地址大概是这样的:"weixin://wxpay/bizpayurl?xxxxxxx" pc要做的就是 把这个地址以二维码形式展示 首先 ...

  9. vue项目生成微信支付二维码(web端),其他二维码也可以生成

    第一步引入第三方插件: npm install –save qrcodejs2 第二步,在vue页面中引用: <template><h2>微信扫码支付</h2>&l ...

最新文章

  1. 【Linux 内核】编译 Linux 内核 ④ ( 打开 Linux 内核编译 菜单配置 |菜单配置中的光标移动与选中状态 | 保存配置 | 配置项帮助文档 )
  2. Linux下安装mysql遇到的一些问题及解决办法
  3. 第五章 运输层(UDP和TCP三次握手,四次挥手分析)
  4. IDA+OD双剑合璧=逆向无敌
  5. tl_war302虚拟服务器,tl-war302设置教程
  6. meanshift算法 java_Meanshift,聚类算法
  7. Elasticsearch7.15.2 ik中文分词器 定制化分词器之扩展词库(远程)
  8. A-Deeper-Understanding-of-Spark-Internals(Spark内核深入理解)
  9. echarts 折线图阴影颜色渐变
  10. [笔记] SRAM Controller
  11. 分享老齐【学方法】宽信用周期对股市的影响!
  12. 提交到dockerHub
  13. Dynamic GCN:Dynamic GCN: Context-enriched Topology Learning for Skeleton-based Action Recognition
  14. 如何做research和survey
  15. SpringBoot 统一功能处理
  16. 【SwiftUI模块】0007、SwiftUI新手指引-新手指示-聚光灯介绍说明
  17. 目前视频监控领域高清化的关键技术有哪些?
  18. 数据类型_number_number数据类型概括
  19. 用友u8文件服务器备份,用友u8 数据备份到云服务器
  20. 《The Man Who Solved The Market》——量化大师西蒙斯新书总结

热门文章

  1. 【转】如何从计算视角研究网络传播影响力最大化问题?
  2. armbian 斐讯n1_斐讯N1安装Armbian
  3. C语言基础——C语言概述——语句和每行代码的含义
  4. VS2005 设置DLL程序无入口点
  5. 最长的英文单词十大排行榜
  6. Twitter注册如何做到ip防关联
  7. hanlp自然语言处理包的基本使用--python
  8. 关于RundownProtect到底是什么东西
  9. Visio2010中设置线为直线
  10. 100个世界上鲜为人知的“常识”