最近在做跨平台小程序,所以涉及到了各平台的支付功能。
首先看一下百度小程序提供的参数组装:
接下来就是自己对这些参数进行组装,代码如下:
/** * 构造参数 * @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