引言:最近在开发支付宝小程序生成二维码的时候碰到了一点问题,记录一下
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);