技术要点(具体开发代码,在(公正年报H5)中实现
1、申请好公众号,获取AppID(公众号ID)AppSecret(公众号密钥)
2、申请微信支付账户,获取(商户号)和(密钥)
3、在微信支付账户中绑定公众号,然后在公众号中同意授权绑定,使两者产生关联
代码实现
一、h5页面,调用方法获取code
public function getGzhCode() {$appid = 'xxx';//公众号appid$redirect_uri = urlencode('https://abcd/me'); // 用户同意授权后,能够跳转的回调链接地址// 获取code$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$redirect_uri&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";header('Location: ' . $url);exit(); }
二、在上面设置的回调页面me中(通过code获取access_token和openId),这个openId就是用户在公众号中的身份ID,支付的时候通过这个ID来实现
if (isset($_GET['code'])) {$appid = 'xxx';//公众号appid$appsecret = 'xxx';//公众号secret$code = $_GET['code'];//获取回调传过来的code,通过code再获取token以及openId$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$appsecret&code=$code&grant_type=authorization_code";$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$result = curl_exec($ch);curl_close($ch);$data = json_decode($result, true);$openId = $data['openid']; // 用户的openidSession::set('openId',$openId);//保存openid到session中 //判断用户是否已存在,不存在则先保存新用户记录 $userData = GznbUserModel::where('openId',$openId)->find();if(empty($userData)){$save['openId'] = $openId;GznbUserModel::create($save);$userData = GznbUserModel::where('openId',$openId)->find();}$this->assign('userData',$userData);return $this->view->fetch(); }
至此,已经完成了获取用户openId和保存记录,用户下次登录或支付时,通过这个openId来锁定身份
三、微信公众号-JSAPI支付实现
1、生成微信公众号-JSAPI支付参数,传递给H5页面做为config
public function form() {if(request()->isPost()){//支付页面,提交订单,保存订单记录$openId = Session::get('openId');$status = 0;$trade_no = '';if($openId){$data = $this->request->param();$userData = GznbUserModel::where('openId',$openId)->find();if($userData){$data['userId'] = $userData['id'];$data['orderNumber'] = $this->getOrderNumber();//生成随机订单号,和回调时对应$data['trade_no'] = $data['orderNumber'];$res = GznbOrderModel::create($data);if($res){$trade_no = $data['orderNumber'];$status =