Skip to content

Commit

Permalink
miniProgramQrcode
Browse files Browse the repository at this point in the history
  • Loading branch information
Ethan committed Feb 21, 2019
1 parent ff935d1 commit eea8560
Showing 1 changed file with 89 additions and 0 deletions.
89 changes: 89 additions & 0 deletions src/Service/QrcodeService.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

namespace PFinal\Wechat\Service;

use PFinal\Wechat\Api;
use PFinal\Wechat\Kernel;
use PFinal\Wechat\Support\Curl;
use PFinal\Wechat\WechatException;

/**
* 生成带参数的二维码
* https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443433542
Expand Down Expand Up @@ -98,4 +103,88 @@ public static function url($ticket)
{
return 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=' . urlencode($ticket);
}

/**
* 生成小程序二维码
* @see https://developers.weixin.qq.com/miniprogram/dev/api/getWXACodeUnlimit.html
*
* @param string $page 必须是已经发布的小程序存在的页面(否则报错),例如 pages/index/index, 根路径前不要填加 /,不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面
* @param string $scene 最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)
* @return mixed 直接返回图片二进制内容
* @throws WechatException
*/
public static function miniProgramQrcode($page, $scene)
{
//page: pages/share-detail/main
//scene: 567898

//小程序配置信息
$miniAppId = Kernel::getConfig('miniAppId');
$miniSecret = Kernel::getConfig('miniSecret');

$api = new Api($miniAppId, $miniSecret);
$accessToken = $api->getAccessToken();

//POST 参数需要转成 JSON 字符串,不支持 form 表单提交。
$data = json_encode([

//必须是已经发布的小程序存在的页面(否则报错),例如 pages/index/index, 根路径前不要填加 /,不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面
'page' => $page,

//最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)
'scene' => $scene,
]);

//https://developers.weixin.qq.com/miniprogram/dev/api/getWXACodeUnlimit.html
$client = new Curl();
$image = $client->execute('https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=' . $accessToken, 'post', $data, [
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
]
]
);


if (strlen($image) > 500) {
header('Content-type: image');
return $image;
}

//出错了
$arr = @json_decode($image, true);

//{"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest hint: [AuPmBa0394vr53!]"}

if (is_array($arr) && $arr['errcode'] == 40001) {

//更新token
$accessToken = $api->getAccessToken(false);

//POST 参数需要转成 JSON 字符串,不支持 form 表单提交。
$data = json_encode([

//必须是已经发布的小程序存在的页面(否则报错),例如 pages/index/index, 根路径前不要填加 /,不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面
'page' => $page,

//最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)
'scene' => $scene,
]);

$client = new Curl();
$image = $client->execute('https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=' . $accessToken, 'post', $data, [
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
]
]
);

if (strlen($image) > 500) {
header('Content-type: image');
return $image;
}
$arr = @json_decode($image, true);
}

throw new WechatException($arr['errmsg'], $arr['errcode']);
}
}

0 comments on commit eea8560

Please sign in to comment.