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

2 篇文章 0 订阅

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

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

/**
     * 构造参数
     * @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);

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值