由于网站使用的微信Native扫码支付,现在公众号需要接入功能,怎么办呢,看这官方文档,参考着demo进行写吧。直接进入正题
进入公众号(服务号)设置--->功能设置--->网页授权域名配置好需要进行支付的页面,支持配置根目录。这一步是为了获取用户的openid。
进入微信商户平台(pay.weixin.qq.com)设置JSAPI支付支付目录,设置路径:商户平台-->产品中心-->开发配置。配置好之后便可以开始着手进行开发,当你看到官方文档的业务流程当中的业务流程时序图的时候,我相信你是一脸懵逼,腾讯的什么都好,就开发文档容易让人给看晕,不过已经算方便了。
由于之前写得一个功能,在用户点击进入页面的时候已经获取用户的信息,并存入到session中,因此下面的代码中的openid直接从session获取。
接下来下载官方demo(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1),这里下载php,放到extend目录下,目录结构为
核心代码便是lib文件夹下的类库,example中有官方demo,可以直接进行改写。
文件已经引入,着手实现支付功能,在控制器写index方法
1 public function index() 2 { 3 4 if (IS_POST) { 5 12 include(ROOT_PATH.'extend/Wxpay/lib/WxPay.Api.php'); 13 include(ROOT_PATH.'extend/Wxpay/example/WxPay.JsApiPay.php'); 14 // include(ROOT_PATH.'extend/Wxpay/example/WxPay.config.php'); 15 include(ROOT_PATH.'extend/Wxpay/example/log.php'); 16 17 try{ 18 $tools = new \JsApiPay(); 19 $openId = session('openid');//这里是之前获取到的openid并存入session,直接从session获取,否则为以下两句 20 21 /*$tools = new JsApiPay(); 22 $openId = $tools->GetOpenid();*/ 23 //②、统一下单 24 $input = new \WxPayUnifiedOrder(); 25 $input->SetBody("在线支付"); 26 $input->SetAttach("在线支付"); 27 $input->SetOut_trade_no($data["orderid"]); 28 $input->SetTotal_fee($data["pricetotal"]*100); 29 $input->SetTime_start(date("YmdHis")); 30 $input->SetTime_expire(date("YmdHis", time() + 600)); 31 $input->SetGoods_tag("test"); 32 $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://'; 33 //echo $http_type . $_SERVER['HTTP_HOST']; 34 $input->SetNotify_url($http_type . $_SERVER['HTTP_HOST']."/index.php/Payoff/Wxpay/notifyurl.html");//notify是接收异步通知的页面,可以进行业务逻辑处理 35 $input->SetTrade_type("JSAPI"); 36 $input->SetOpenid($openId); 37 $config = new \WxPayConfig(); 38 $order = \WxPayApi::unifiedOrder($config, $input); 39 $jsApiParameters = $tools->GetJsApiParameters($order); 40 41 //获取共享收货地址js函数参数 42 $editAddress = $tools->GetEditAddressParameters(); 43 } catch(Exception $e) { 44 Log::ERROR(json_encode($e)); 45 } 46 $this->assign('data', $data); 47 $this->assign('jsApi', $jsApiParameters); 48 $this->display(); 49 } 50 else 51 { 52 E("Access Denied"); 53 } 54 55 56 }
在视图文件中根据自己需要,下面随便写的demo
<form id="thisform" action="#" method="post"> 订单号:{$data['orderid']}<input type="hidden" name="orderid" class="form-control" id="orderid" value="{$orderid}"><br><br> 金额:{$data['pricetotal']} 元<input type="hidden" name="money" class="form-control" id="goodprice" value="50"><br><br> <div align="center"> <button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay()" >立即支付button> div> form> <script type="text/javascript"> //调用微信JS api 支付 function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', {$jsApi}, function(res){ WeixinJSBridge.log(res.err_msg); alert(res.err_code+res.err_desc+res.err_msg); } ); } function callpay() { if (typeof WeixinJSBridge == "undefined"){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall); } }else{ jsApiCall(); } } script>
这里直接用的是官方demo的JS,没有修改,可以根据获取的支付结果做相应的业务逻辑处理。至此便成功调起手机微信端支付,可以根据demo处理自己的业务逻辑。