zoukankan      html  css  js  c++  java
  • php 支付宝新版本app支付以及回调

    ;支付宝快速接入;

    支付宝2017年新版本支付基本业务逻辑

    服务端生成字符串 交给客户端,

    客户端调用接口,将这段字符串str传过去 调用起支付界面。

    其中字符串str包含了所有请求参数,以及请求参数和用户自己生成的私钥进行加密处理生成sign

    (所有请求参数按照键值顺序排序。然后以rsa2加密手段和用户生成的私钥2048的那种进行加密)

    下面上代码。找到支付宝skd里的 AopClient.php文件 填上如下配置

      

    public $appId = "20170925123213213"; //记得是appid 不是以前的pid
    
    //私钥值 2048的那种私钥 用户自己生成的
     public $rsaPrivateKey="MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQCCeAyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxNHXwZJYxCjy6QVgsw6uyz0IQx0Hq5NAn99jk5OfYVpfnyFOZwqF4xwG9LA9CAK/BYUSc/yGN2I9e/2hxkIcKpwBUmdecCQjW7L0hXXVoOP4d9I5EUNAvlwUYWkxZNlblZ3akir17JCcRyS99HpaU37RP+Tu+RqPk/ZtJh4KlT5uS0Y760bBUvSLMitFcVMJ+Gnt7GbLqRNAoGAO7NL+MUFu64Q+s+g1z9kwq5S1CbI3YbUfSDP1Uq3PJ4cEiwPB93fQew3hyQ9NKs+QkTNah90/n8zlhypIUsrUAsR/uBjbgs39jGGxfFwPWvjHyQiT6z2H9YCcgOHi2yWZchJIbTF0RP6qeJyZV02FOauvyFEcFxBA+NukI1wcCE=";
    //支付宝公钥(非生成私钥对应的那个公钥,生成的公钥叫应用公钥。上传到支付宝后台后会生成支付公钥)
    public $alipayrsaPublicKey="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqx1N29eEAkv+InFjskPXo0CsJEidvm6dTLA13TXWfj8OvoMVag5Cim7byZCbI4JpGBRgNP7OnTeTsYesPx8QBBxxxxxxxxxxxxxfOW8i9RND48p0DxZ1SkGvQwnUQ8eJcy0CePH7SzQIDAQAB";
    
     //签名类型 
    public $signType = "RSA2";

    服务端生成字符串str

         require_once "/core/public/plugin/alipay20171012/AopSdk.php";
            $c = new AopClient;        
            $request = new AlipayTradeAppPayRequest();
            
            /**业务参数**/
            // $content['body'] = "Iphone6 16G"; //对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。非必填参数
            $content['subject'] = "给用户充值10000钻石";//商品的标题/交易标题/订单标题/订单关键字等。
            $content['out_trade_no'] = $out_trade_no;//商户网站唯一订单号
            // $content['timeout_express'] = "30m";//该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。注:若为空,则默认为15d。
            $content['total_amount'] =number_format($money,2,".","");//    订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000],
            $content['product_code'] = "QUICK_MSECURITY_PAY";//    销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY
            // $content['goods_type'] = "0";//    商品主类型:0—虚拟类商品,1—实物类商品注:虚拟类商品不支持使用花呗渠道  非必填参数
            $con = json_encode($content);//$content是biz_content的值,将之转化成字符串
            /**业务参数**/
    
            /**公共参数**/
            $param = array();
            $param['app_id'] = $c->appId;//支付宝分配给开发者的应用ID
            $param['method'] = 'alipay.trade.app.pay';//接口名称
            $param['charset'] = 'utf-8';//请求使用的编码格式
            $param['sign_type'] = 'RSA2';//商户生成签名字符串所使用的签名算法类型
            $param['timestamp'] = date("Y-m-d H:i:s");//发送请求的时间,格式"yyyy-MM-dd HH:mm:ss"
            $param['version'] = '1.0';//调用的接口版本,固定为:1.0
            $param['notify_url'] = WEBHOST.'/pay/alinotify';//支付宝服务器主动通知地址
            $param['biz_content'] = $con;//业务请求参数的集合,长度不限,json格式
            /**公共参数**/
            
             //生成签名
            $paramStr = $c->getSignContent($param);
            $sign = $c->alonersaSign($paramStr,$c->rsaPrivateKey,'RSA2');
            
            $param['sign'] = $sign;
            $str = $c->getSignContentUrlencode($param);//返回给客户端

    异步通知处理

    异步通知主要就是 验证签名是否合法。

    代码很简单

    require_once dirname(dirname(dirname(__FILE__)))."/core/public/plugin/alipay20171012/AopSdk.php";
    $c = new AopClient;
            
    $result = $c->rsaCheckV1($_POST,$c->alipayrsaPublicKey,$_POST['sign_type']);

    这里如果校验成功 $result 返回true 注意一定校验的公钥是支付宝公钥,非自己生成的那个公钥

    校验成功后

    1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email);4、验证app_id是否为该商户本身。上述1、2、3、4有任何一个验证不通过,则表明同步校验结果是无效的,只有全部验证通过后,才可以认定买家付款成功。

    这些都简单。没什么好说的。 后面就自己业务处理上的了

  • 相关阅读:
    常见限流算法
    spring aop 事物
    Java序列化和反序列化为什么要实现Serializable接口
    java类在何时被加载?
    mysql 排序 是怎么工作的?
    程序员转正述职报告
    .NET中使用Channel<T>
    .NET-服务承载系统(Hosting)(支持Cron表达式)
    JObject拼接Json字符串
    NET5 使用FTP发布
  • 原文地址:https://www.cnblogs.com/phpjinggege/p/7728379.html
Copyright © 2011-2022 走看看