文章:php接入微信支付,扫码支付和H5支付(非微信浏览器),基于thinkPHP框架 WeChatDeveloper支付类包 踩坑指南
文章:php快速接入支付宝即时支付,PC网站支付和手机网站支付,基于thinkPHP框架 WeChatDeveloper支付类包
在使用前可以先看上面的微信扫码支付和H5支付的文章,本文主要介绍微信JSAPI支付,在微信内拉起支付;
1、在开发前请先确认回调的域名是否加入了JS安全域名,IP白名单,微信公众平台和微信支付平台都要加,并且开通了对应的产品;
2、复制以下代码前必须安装WeChatDeveloper类,下面都是基于这个类写的,如果不安装不用在往下看了;
3、在使用下面的类之前需要先获取到用户的code,下文会具体说明;
4、下面代码部分已经用xxx代码,需要替换成自己业务对应的才可以;
在使用JSAPI支付时,openid为必填项,在对非微信端网站使用该支付时,需要先获取到用户的openid;
网页授权流程分为四步:
1、引导用户进入授权页面同意授权,获取code
2、通过code换取网页授权access_token(与基础支持中的access_token不同)
3、如果需要,开发者可以刷新网页授权access_token,避免过期【我们不需要】
4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)【我们也不需要】
首先我们让用户访问下面这个网址获取到用户的code,APPID换成自己的,回调网址就是我们下面这个wxJsApi方法,STATE是非必填的 填不填都可以;
https://open.weixin.qq.com/connect/oauth2/authorize?appid=【APPID】&redirect_uri=【跳转的网址】&response_type=code&scope=snsapi_base&state=【非必填参数】#wechat_redirect
当用户访问了上面这个网址并且会跳转到下面这个wxJsApi方法中,在参数中就会携带用户的code,这个时候我们的getOauthAccessToken就会自动获取用户的信息,里面就包含了openid;具体内容见下文代码:
/**
* 微信JSAPI支付
*/
public function wxJsApi(){
// 准备配置参数
$config = [
'appid' => 'wx1238598xxxxxxxxe',
'appsecret' => '5d6fg5r8g4xxxxxxxxxxxxxx56564hg5',
'mch_id' => '160xxxxx24',
'mch_key' => 'NAMECeShi202120xxxxxxxxxxxx21816',
];
try {
// 实例接口
$openid = new \WeChat\Oauth($config);
// 获取用户的openid
$open_id = $openid->getOauthAccessToken();
// 创建接口实例
$wechat = new \WeChat\Pay($config);
// 组装参数,可以参考官方商户文档
$options = [
'body' => '订单名称',
'out_trade_no' => time(), //订单号
'total_fee' => 1*100, //金额,单位分
'notify_url' => 'http://baidu.com/tongzhi', //异步通知地址
'spbill_create_ip' => $_SERVER["REMOTE_ADDR"],
'trade_type' => 'JSAPI',
'openid' => $open_id['openid']
];
$result = $wechat->createOrder($options);
$jsapi = $wechat->createParamsForJsApi($result['prepay_id']);
// 渲染到前端进行拉起
$this->assign('jsapi',$jsapi);
return $this->fetch();
} catch (\WeChat\Exceptions\InvalidResponseException $e) {
echo $e->getMessage() . PHP_EOL;
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>微信订单支付</title>
</head>
<body>
<script>
function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId":"{$jsapi['appId']}", //公众号名称,由商户传入
"timeStamp":"{$jsapi['timeStamp']}", //时间戳,自1970年以来的秒数
"nonceStr":"{$jsapi['nonceStr']}", //随机串
"package":"{$jsapi['package']}",
"signType":"{$jsapi['signType']}", //微信签名方式:
"paySign":"{$jsapi['paySign']}" //微信签名
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ){
// 使用以上方式判断前端返回,微信团队郑重提示:
// res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
location.href="http://www.baidu.com/ok";
}
});
}
// 页面加载自动触发
window.onload=function(){
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
}else{
onBridgeReady();
}
}
</script>
</body>
</html>