引言:最近在开发支付宝小程序生成二维码的时候碰到了一点问题,记录一下
1.需求
正在开发的这个项目是一个电商类小程序,需求是给每个产品生成一个独立的小程序二维码
2.实现
了解了需求之后,开始查官方文档,找到了下面这个接口,页面地址:支付宝小程序生成二维码
除公共请求参数外,需要的参数是这些,注意看第二个参数,这里跟微信小程序的接口参数不太一样,后面会说到
响应参数是这些,注意,支付宝小程序接口返回的是个图片路径,微信小程序接口则是直接返回图片
因为之前做过微信小程序生成小程序码的功能,所以对整个流程有一定的了解,看了这个文档之后发现与微信小程序生成小程序码的流程区别不大,不过就比微信多传了个describe参数而已(ps:我真是太天真),之前做的微信获取小程序码大致的流程分为以下几步:
- 1.调用官方接口,传两个参数,page:需要跳转的小程序页面路径,scene:自定义的参数,格式为key=value&key=value,也就是url以GET方式传参的格式,来获取二维码数据,其实就是一个图片
- 2.在自己写的接口页面输出二维码
- 3.在需要用到的地方调用自己写的接口,显示二维码
有了这些于是我开始着手尝试,我用的官方sdk
,比较方便,这里我封装成了一个函数,官方SDK传送门
function.php
/**
* 获取支付宝小程序码
* @param string $page 小程序页面路径
* @param string $queryParam 小程序启动参数
* @param string $describe 二维码描述
* @return 图片
*/
function getQrCodeAli($page = "",$queryParam ="" ,$describe ="")
{
// 使用官方sdk构造需要的参数
$aop = new AopClient ();
$aop->gatewayUrl = GATEWAY_URL;
$aop->appId = APPID_ALI;
$aop->rsaPrivateKey = RSA_PRIVATE_KEY;
$aop->alipayrsaPublicKey= RSA_PUBLIC_KEY;
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset='UTF-8';
$aop->format='json';
$request = new AlipayOpenAppQrcodeCreateRequest ();
$request->setBizContent("{" .
"\"url_param\":\"".$page."\"," .
"\"query_param\":\"".$queryParam."\"," .
"\"describe\":\"".$describe."\"" .
" }");
// 执行操作 请求对应的接口
$result = $aop->execute($request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if(!empty($resultCode)&&$resultCode == 10000){
// 请求接口返回的图片路径
echo httpGet($result->$responseNode->qr_code_url);
} else {
echo "失败";
}
}
这里我写了一个接口文件,把header
设置为image
,把图片直接显示出来
image.php
header("Content-Type:image/jpeg");
// 引入函数
require_once("function.php");
// 要跳转的小程序页面
$page = $_GET['page'];
//携带的参数
$scene = $_GET['scene'];
// 描述
$describe = $_GET['describe'];
echo getQrCodeAli($page,$scene,$describe);
3.问题
接着,访问上面写的接口,http://127.0.0.1/image.php?page=pages/index/index&scene=product_id=1&describe=111
,二维码是出来了,扫描之后也进去了指定页面,但是数据为undefined,我第一时间怀疑是参数传错了,检查了好几遍,也没发现问题所在,后台找客服小马哥,也无济于事,不仅回复慢,而且他也不太懂的样子,还是得靠自己,于是开始了百度之旅,百度上关于支付宝生成二维码的词条很少,后来找到了一篇文章,令我恍然大悟,原来支付宝的参数是直接拼接在页面路径后面的,太坑了文章链接
4.解决
既然知道问题所在了就开始动手改代码了,改成下面这种之后,亲测可以使用
echo getQrCodeAli($page."?".$scene,$scene,$describe);