PHP调用官方支付宝sdk的方法生成支付二维码

开通支付宝网站支付功能,基本流程是:商户网站生成订单,然后向支付宝网关发出请求并跳转,支付宝收款成功后通知商户订单状态更新,进行业务处理。

上面流程有个不便之处是用户会跳出商户自己的网站,操作较为繁琐,于是越来越流行在站内完成支付的方式。

通常首选站内生成支付二维码,极速收款。

本文简单介绍PHP调用官方支付宝sdk的方法来实现:

<?php
/*
 * 支付宝支付 - 需要开通当面付!!!
 * @param $body            商品描述(可空)
 * @param $subject         商品名称(必填)
 * @param $total_amount    订单总额(必填)
 * @param $out_trade_no    订单号(必填)
 */
function cpury_custom_qr_alipay($total_amount, $body, $subject, $out_trade_no){
    // 引入sdk中的三个文件
    require_once(plugin_dir_path( __FILE__ ). '../alipay/config.php'); // 配置文件
    require_once(plugin_dir_path( __FILE__ ). '../alipay/aop/AopClient.php');
    require_once(plugin_dir_path( __FILE__ ). '../alipay/aop/request/AlipayTradePrecreateRequest.php');

    $aop = new \AopClient();
    $aop->appId = $config['app_id'];  // 应用唯一ID
    $aop->gatewayUrl = $config['gatewayUrl'];
    $aop->rsaPrivateKey = $config['merchant_private_key']; // 应用私钥
    $aop->alipayrsaPublicKey = $config['alipay_public_key']; // 支付宝公钥
    $aop->signType = "RSA2";
    $aop->format   = "json";
    $aop->charset  = "UTF-8";
    $aop->debugInfo = true;
    $request = new \AlipayTradePrecreateRequest();
    $arr['body']                = $body;
    $arr['subject']             = $subject;
    $arr['out_trade_no']        = $out_trade_no;
    $arr['timeout_express']     = '1d'; // 订单过期时间, 1d代表一天,24小时,还有1分钟(1m)、1小时(1h)等
    $arr['total_amount']        = floatval($total_amount);
    
    $json = json_encode($arr);
    $request->setNotifyUrl($config['notify_url']); // 异步回调地址
    $request->setBizContent($json);
    $result = $aop->execute($request);
    $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
    $resultCode = $result->$responseNode->code;

    if(!empty($resultCode) && $resultCode == '10000') {
        $resp = (array)$result->$responseNode;
        return $resp['qr_code']; // 二维码链接地址,类似:https://qr.alipay.com/xxxxxxxxxxxxxxxxxxx
    }
    else {
        return false;
    }
}

返回成功的结果是一个二维码链接地址,类似:https://qr.alipay.com/xxxxxxxxxxxxxxxxxxx,发送给前端,将这个链接生成文本二维码。

常见问题

  1. 支付宝官方sdk需要手动引入SignData类

文件alipay/aop/AopClient.php中使用了SignData类,但没用引入该类:

// alipay/aop/AopClient.php

	function parserJSONSignData($request, $responseContent, $responseJSON) {

		$signData = new SignData();

		$signData->sign = $this->parserJSONSign($responseJSON);
		$signData->signSourceData = $this->parserJSONSignSource($request, $responseContent);

		return $signData;

	}

需要手动添加下:

require_once 'SignData.php';

2.提示错误码:40004 ACQ.ACCESS_FORBIDDEN

生成支付二维码必须签约开通当面付功能!

另外,用原生方法向支付宝网关发送请求也可以,就是稍微麻烦些,可见参考资料。

参考资料

  • https://www.cnblogs.com/chenchenphp/p/14139376.html
  • https://blog.csdn.net/chendongpu/article/details/120740709