1、前往微信公众平台申请:微信公众号的appId、secret
2、前往微信商户平台申请:微信商户的商户id、支付key
3、下载微信提供的SDK:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
下载微信商户平台的API安全证书:https://pay.weixin.qq.com/index.php/core/cert/api_cert
4、进入微信公众平台,在微信公众号设置—>功能设置 里面设置微信JS接口安全域名、网页授权域名
5、进入微信商户平台,进入进入产品中心—>开发配置,设置支付授权目录
6、进入微信商户平台,进入产品中心—>APP授权管理,点击新增授权申请单
7、配置完成上代码!:
首先获取用户授权:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
类似代码:
function wxpayurl(){
$urlObj["appid"] = '';
$urlObj["redirect_uri"] = '';//如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。
$urlObj["response_type"] = "code";
$urlObj["scope"] = "snsapi_base";
$urlObj["state"] = "#wechat_redirect";//网页参数 例如“uid1_mony10#wechat_redirect” 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
$bizString = http_build_query($urlObj);
$url="https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
Header("Location: $url");
}
以上代码是在用户下单页面(不是支付页面)点击下单时跳转至wxpayurl方法跳转至微信页再由微信返回回调页面并携带code参数以及state参数,接下来获取code换取openid:
function (){
$code=I('code');
$state=I('state');
$input_data=$this->paySubstrDate($state);//将“uid1_mony10#wechat_redirect”分割,用户购买东西以及用户id
$urlObj['appid'] = ‘’;//appid
$urlObj['secret'] = '';//微信公众号app_secret
$urlObj['code'] = $code;
$urlObj['grant_type'] = 'authorization_code';
$queryStr = http_build_query($urlObj);
$url='https://api.weixin.qq.com/sns/oauth2/access_token?' . $queryStr;
$res=file_get_contents($url);
$data = json_decode($res, true);
//拿到openid,拼接支付参数
$wechatJsApiPay = new \wechatJsApiPay($this->conf);
$params['out_trade_no'] = ‘’;//订单号
$params['body'] = ‘’;//商品描述
$params['total_fee'] = ‘’; // 单位为分,不是元,也不是角
$params['trade_type'] = 'JSAPI';
$params['openid'] = $data['openid'];
$params['attach'] = ‘’;//支付显示内容
$params['spbill_create_ip'] = $_SERVER['REMOTE_ADDR'];
$result = $wechatJsApiPay->unifiedOrderJs($params);
$data = $wechatJsApiPay->getAppPayParams($result['prepay_id']);
//签名
$data2['appId']=$data['appid'];
$data2['nonceStr']=$data['noncestr'];
$data2['signType']="MD5";
$data2['package']="prepay_id=".$data['prepayid'];
$data2['timeStamp']=$data['timestamp'];
$wechatJsApiPay = new \wechatJsApiPay($this->conf);
$data['sign2']=$wechatJsApiPay->MakeSign($data2);
//将数据传输到前端确认支付页面换起微信js支付插件
$this->assign('_data', $data);
$this->display();
}
前端确认支付页面加入微信支付js代码 当用户点击确认支付时触发
<script type="text/javascript">
function onBridgeReady(){
var appId = "{$_data['appid']}";
var timeStamp = "{$_data['timestamp']}";
var nonceStr = "{$_data['noncestr']}";
var package = "{$_data['prepayid']}";
var paySign = "{$_data['sign2']}";
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId":appId, //公众号名称,由商户传入
"timeStamp":timeStamp, //时间戳,自1970年以来的秒数
"nonceStr":nonceStr, //随机串
"package":"prepay_id="+package,
"signType":"MD5", //微信签名方式:
"paySign":paySign //微信签名
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ){
// 使用以上方式判断前端返回,微信团队郑重提示:
//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
}
});
}
//onBridgeReady();
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>
8、异步处理 验签 处理数据库逻辑
$wechatJsApiPay = new \wechatJsApiPay($this->conf);
$data = $wechatJsApiPay->getNotifyData();
$flag = $wechatJsApiPay->rsaCheckNotifySign($data);
if($flag){
$data
//处理数据库
}else{
//验签失败
}