PHP 百度小程序支付,回调处理

PHP 百度小程序支付,回调处理最近在做跨平台小程序,所以涉及到了各平台的支付功能。首先看一下百度小程序提供的参数组装:接下来就是自己对这些参数进行组装,代码如下:/***构造参数*@paramarray$post订单数据*@returnmixed*@throwsException*/publicfunctioncreatePar…

最近在做跨平台小程序,所以涉及到了各平台的支付功能。

首先看一下百度小程序提供的参数组装:
在这里插入图片描述
接下来就是自己对这些参数进行组装,代码如下:

/** * 构造参数 * @param array $post 订单数据 * @return mixed * @throws Exception */
    public function createParam($post = []){ 
   
        if (empty($post)) return false;
        $data['dealId']          = 'dealId(百度收银台的财务结算凭证)';  // 跳转百度收银台支付必带参数之一,是百度收银台的财务结算凭证,与账号绑定的结算协议一一对应,每笔交易将结算到dealId对应的协议主体
        $data['appKey']          = 'appKey(表示应用身份的唯一ID)'; // 支付能力开通后分配的支付appKey,用以表示应用身份的唯一ID,在应用审核通过后进行分配,一经分配后不会发生更改,来唯一确定一个应用
        $data['totalAmount']     = 'totalAmount(订单总金额,以分为单位)'; 		// 订单总金额,以分为单位
        $data['tpOrderId']       = 'tpOrderId(商户平台自己记录的订单ID)'; 	// 商户平台自己记录的订单ID
        $data['rsaSign']         = $this->genSignWithRsa($data,$config['bd_pri_key']); // 对appKey+dealId+tpOrderId+totalAmount进行RSA加密后的签名,防止订单被伪造
        $data['dealTitle']       = $post['title']; // 订单的名称
        $data['signFieldsRange'] = 1; // 固定值1
        $data['bizInfo']         = ''; // 订单详细信息,需要是一个可解析为JSON Object的字符串
        return $data;
    }
参考百度提供的PHP生成签名的工具类
/** * @desc 私钥生成签名字符串 * @param array $assocArr * @param string $priKey * @param bool $rsaPriKeyStr * @return bool|string * @throws Exception */
public function genSignWithRsa(array $assocArr,$priKey, $rsaPriKeyStr = true){ 
   
        $sign = '';
        if (empty($rsaPriKeyStr) || empty($assocArr)) { 
   
            return $sign;
        }
        $priKey = chunk_split($priKey, 64, "\n");
        $priKey = "-----BEGIN RSA PRIVATE KEY-----\n$priKey-----END RSA PRIVATE KEY-----\n";
        if (isset($assocArr['sign'])) { 
   
            unset($assocArr['sign']);
        }
        ksort($assocArr); //按字母升序排序
        $parts = array();
        foreach ($assocArr as $k => $v) { 
   
            $parts[] = $k . '=' . $v;
        }
        $str = implode('&', $parts);
        openssl_sign($str, $sign, $priKey);
        return base64_encode($sign);
    }

然后剩下的就可以交给前端进行处理了。记得在百度小程序后台配置好回调地址

接下来就是回调的代码处理了

可以将回调信息写入本地文件

file_put_contents('baidu.txt',json_encode($_POST),FILE_APPEND);
$userId     = $data['userId']; //百度用户ID
$orderId    = $data['orderId']; //百度平台订单ID【幂等性标识参数】(用于重入判断)
$unitPrice  = $data['unitPrice']; //单位:分
$count      = $data['count']; //数量
$totalMoney = $data['totalMoney']; //订单的实际金额,单位:分
$payMoney   = $data['payMoney']; //扣除各种优惠后用户还需要支付的金额,单位:分
$dealId     = $data['dealId']; //百度收银台的财务结算凭证
$payTime    = $data['payTime']; //支付完成时间,时间戳
$payType    = $data['payType']; //支付渠道值
$partnerId  = $data['partnerId']; //支付平台标识值
$status     = $data['status']; //1:未支付;2:已支付;-1:订单取消
$tpOrderId  = $data['tpOrderId']; //业务方唯一订单号
$returnData = $data['returnData']; //业务方下单时传入的数据
$rsaSign    = $data['rsaSign']; //全部参数参与签名
require '../baidupay.class.php'; // 引入模型文件

unset($data['rsaSign']); // rsaSign 不需要参与签名
$class        = new BaiduPay();
$data['sign'] = $rsaSign;

$check_sign = $class->checkSignWithRsa($data);
if ($check_sign) return 'failed'; // 验签失败

if($status == 2) { 
    
	// 如果订单已支付,进行业务处理并返回核销信息
    ...	...

    // 需要返回的响应
    $ret['errno'] = 0;
    $ret['msg']   = 'success';
    $ret['data']  = json_encode(['isConsumed'=>2]);
    echo json_encode($ret);
}

关于checkSignWithRsa方法,参考百度文档PHP相关的签名生成的参考代码

/** * @desc 公钥校验签名 * @param array $assocArr * @param $rsaPubKeyStr * @return bool * @throws Exception */
  public function checkSignWithRsa(array $assocArr ,$rsaPubKeyStr = true){ 
   
      global $_W;
      if (!isset($assocArr['sign']) || empty($assocArr) || empty($rsaPubKeyStr)) { 
   
          return false;
      }

      $sign = $assocArr['sign'];
      unset($assocArr['sign']);

      if (empty($assocArr)) { 
   
          return false;
      }

      ksort($assocArr); //按字母升序排序
      $parts = array();
      foreach ($assocArr as $k => $v) { 
   
          $parts[] = $k . '=' . $v;
      }
      $str    = implode('&', $parts);
      $sign   = base64_decode($sign);
      $pubKey = 'bd_pub_key';  // 公钥串
      $pubKey = chunk_split($pubKey, 64, "\n");
      $pubKey = "-----BEGIN PUBLIC KEY-----\n$pubKey-----END PUBLIC KEY-----\n";
      $result = (bool)openssl_verify($str, $sign,$pubKey);
      return $result;
  }

最后就是基本的方法调用了

//构造支付参数
$orderPay = array(
    'tid'        => $out_trade_no,
    'user'       => $user['openid'], //用户OPENID
    'fee'        => $actual_fee, //实际支付金额
    'title'      => 'pay',
);

load()->classs("baidupay");
 $baidu = new BaiduPay();
 $res   = $baidu->createParam($orderPay);
 pdo_commit();// 全部执行成功提交
 return $this->result(0,'success',$res);

好啦,以上就是百度智能小程序完整的支付与回调了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/39287.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注