最近项目里面需要做公众号和H5支付的功能,根据自己的体验,整理了一下,做个记录。
首先我解释一下,为什么有公众号支付还要做H5支付?因为不确定每个用户在公众号上打开网站,所以另外做了H5支付。
以下是官方的解释:
H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付。
主要用于触屏版的手机浏览器请求微信支付的场景。可以方便的从外部浏览器唤起微信支付。
提醒:H5支付不建议在APP端使用,如需要在APP中使用微信支付,请接APP支付,文档详见微信支付开发文档。
既然是公众号支付,准备工作要做好:
必须是认证的服务号才能支付,详细接口权限见官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433401084。
1.登陆公众号:
2.
3.登陆商户平台(pay.weixin.qq.com)
在开发配中设置如下:
H5支付直接填写服务器的域名即可。
JSAPI授权目录这里需要注意,如果支付授权目录没有设置正确,在请求JSAPI时,会提示“-1当前页面的url未注册”的错误。”
首先要看你支付的当前页面URL,
比如是:http://www.xxx.com/wxpay/jsapi.php
你就必须填写:http://www.xxx.com/wxpay/
假如是:http://www.xxx.com/wxpay/order/id/56.html
你就必须写: http://www.xxx.com/wxpay/order/id/
假如是:http://www.xxx.com/wxpay/order?id=56
你就必须写:http://www.xxx.com/wxpay/order/
下面是代码部分:
下载好官方的sdk,我是放到网站的根目录,看网上有把SDK进行集成封装好的,大家可自行搜索。
1.在lib----->下的Wxpay.Config.php文件中,填好APPID、MCHID、KEY(操作密码)、APPSECRET(公众帐号secert)
设置证书:
在配置文件的最后最好加上回调地址(当时我没有设置报错了,想不起来是什么错误了,没及时记录……)
2.写一个验证token的方法(代码是网上找的,顺便找了一下有关token的登陆介绍:http://blog.csdn.net/resilient/article/details/72673222)


1 <?php 2 /** 3 * wechat php test 4 */ 5 //define your token 6 define("TOKEN", "shendai"); 7 $wechatObj = new wechatCallbackapiTest(); 8 $wechatObj->valid(); 9 10 class wechatCallbackapiTest11 {12 public function valid()13 {14 $echoStr = $_GET["echostr"];15 //valid signature , option16 if ($this->checkSignature())17 {18 echo $echoStr;19 exit;20 }21 }22 public function responseMsg()23 {24 //get post data, May be due to the different environments25 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];26 //extract post data27 if (!empty($postStr))28 {29 $postObj = simplexml_load_string($postStr, ‘SimpleXMLElement‘, LIBXML_NOCDATA);30 $fromUsername = $postObj->FromUserName;31 $toUsername = $postObj->ToUserName;32 $keyword = trim($postObj->Content);33 $time = time();34 $textTpl = "<xml>35 <ToUserName><![CDATA[%s]]></ToUserName>36 <FromUserName><![CDATA[%s]]></FromUserName>37 <CreateTime>%s</CreateTime>38 <MsgType><![CDATA[%s]]></MsgType>39 <Content><![CDATA[%s]]></Content>40 <FuncFlag>0</FuncFlag>41 </xml>";42 if (!empty($keyword))43 {44 $msgType = "text";45 $contentStr = "Welcome to wechat world!";46 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);47 echo $resultStr;48 }49 else50 {51 echo "Input something...";52 }53 }54 else55 {56 echo "";57 exit;58 }59 }60 private function checkSignature()61 {62 $signature = $_GET["signature"];63 $timestamp = $_GET["timestamp"];64 $nonce = $_GET["nonce"];65 $token = TOKEN;66 $tmpArr = array($token, $timestamp, $nonce);67 sort($tmpArr);68 $tmpStr = implode($tmpArr);69 $tmpStr = sha1($tmpStr);70 if ($tmpStr == $signature)71 {72 return true;73 }74 else75 {76 return false;77 }78 }79 80 81 }82 83 ?>
View Code