前端部分
点击按钮,获取手机号
<button open-type="getPhoneNumber" @getphonenumber="bindGetPhoneNumber" hover-class="none"
class="btn-purity">一键获取</button>
传入openid和code
bindGetPhoneNumber(e) {
var that = this;
if (e.detail.errMsg == 'getPhoneNumber:fail user deny') {
uni.showModal({
title: '温馨提示',
content: '您已拒绝授权,无法获取手机号!',
showCancel: false,
success: function(res) {
if (res.confirm) {
uni.$emit("getContract", {});
uni.navigateBack();
// uni.switchTab({
// url: "/pages/home/index/index"
// })
}
}
});
return;
} else {
var json = {
openid: this.userInfo.openid,
};
let version = uni.getSystemInfoSync().SDKVersion;
// json['encryptedData'] = e.detail.encryptedData;
// json['iv'] = e.detail.iv;
json['code'] = e.detail.code;
this.$api.user.getPhone(json).then(res => {
console.log(7777123, res)
if (res !== false) {
this.phoneNumber = res.data.mobile
}
});
}
},
后台部分
初始化EasyWechat的核心类
private $app;
public $payment;
public function __construct()
{
$config = get_addon_config('lineup');
Log::write('[ Log LIST ++++++++++$config ] ' . json_encode($config, JSON_UNESCAPED_UNICODE), 'debug');
$options = [
'app_id' => $config['app_id'],
'secret' => $config['app_secret'],
'response_type' => 'array',
];
$payment_config = [
// 必要配置
'app_id' => $config['app_id'] ?? '',
'mch_id' => $config['mch_id'] ?? '',
'key' => $config['mch_key'] ?? '', // API 密钥
// 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书)
'cert_path' => '', // XXX: 绝对路径!!!!
'key_path' => '', // XXX: 绝对路径!!!!
'notify_url' => '', // 你也可以在下单时单独设置来想覆盖它
];
try {
$this->app = Factory::miniProgram($options);
$this->payment = Factory::payment($payment_config);
} catch (\Exception $e) {
\think\Log::error('初始化失败:' . $e->getMessage());
}
}
/**
* 根据 jsCode 获取用户 session 信息
*/
public function jscode2session($code)
{
return $this->app->auth->session($code);
}
/**
* 获取手机号
* @param $code
*/
public function getPhoneNumber($code){
$token = $this->app->access_token->getToken();
try {
$data = Http::post("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=".$token['access_token'],json_encode(['code'=>$code]));
$data = json_decode($data,true);
if($data['errcode'] != '0'){
throw new Exception("获取手机号失败");
}
}catch (ErrorException $exception){
throw $exception;
}
return $data['phone_info'];
}
/**
* 微信小程序消息解密
*/
public function decryptData($session, $iv, $encryptedData)
{
return $this->app->encryptor->decryptData($session, $iv, $encryptedData);
}
解析出手机号
public function decryptPhoneNumber($post)
{
$wxmini = new \app\common\library\lineup\Wxmini();
//新版本授权
try {
if(!empty($post['code'])){
$return = $wxmini->getPhoneNumber($post['code']);
}else if($post['iv'] && $post['encryptedData']){
$return = $wxmini->decryptData($post['session_key'], $post['iv'], $post['encryptedData']);
}else{
throw new Exception("参数错误");
}
}catch (Exception | ErrorException $e){
return [
'status' => false,
'info' => $e->getMessage(),
'data' => [],
];
}
return [
'status' => true,
'data' => [
'mobile' => isset($return['phoneNumber']) ? $return['phoneNumber'] : '',
],
];
}