标签:
前几日刚刚做完微信公众号JS支付,以下是在做微信支付时遇到的一些小问题,以备后用,这里使用PHP
一、关于在公众平台设置的参数
1、微信支付--开发配置:支付授权目录,测试授权目录,测试白名单,(扫码支付回调URL当时也设置了,可以先不设置,回来再看)
2、公众号设置--功能设置:JS接口安全域名,填写例如baidu.com的形式
3、接口权限:网页账号(网页授权获取用户基本信息),点击修改,填写回调域名,例如www.baidu.com形式。该域名需要通过ICP备案
二、需要的一些配置参数
1、公众号应用ID:APPID (在“公众平台--基本配置”中查看)
2、商户号ID:MCHID (在“公众平台--微信支付”中查看,注意一些商户号后面有“服务商”三个字代表是服务商商户号,服务商需要子商户号;无“服务商”的不需要子商户号)
3、应用密钥:APPSECRET (在“公众平台--基本配置”中查看)
4、支付安全密钥:KEY (在“商户平台--API安全”中设置“API密钥”,可能需要下载安全证书)
5、下载证书 (在“商户平台--API安全”中下载API证书)
三、开发阶段步骤
1、下载官方demo,地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
2、将cert下的两个证书替换为自己的
3、将lib/WxPay.Config.php中的APPID,MCHID,KEY,APPSECRET设置为自己的
4、example/jsapi.php中的“$input->SetNotify_url(...)”改为自己的
------------------此时再修改index.php中的地址,即可进行一次0.01元测试-----------------
5、做自己测试阶段可以将“lib/Wxpay.Data.php”中的MakeSign方法在步骤二和步骤四下面进行输出,可以查看生成的签名是否正确
public function MakeSign() { //签名步骤一:按字典序排序参数 ksort($this->values); $string = $this->ToUrlParams(); //签名步骤二:在string后加入KEY $string = $string . "&key=".WxPayConfig::KEY; print_r("string:".$string."<br />"); //输出生成的字符串 //签名步骤三:MD5加密 $string = md5($string); //签名步骤四:所有字符转为大写 $result = strtoupper($string); print_r("MakeSign:".$result); //输出生成的签名 return $result; }
如果有问题,可以在https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1中检查签名,如果签名有错误则证明字段有误,签名与自己的签名一致则可能是前面参数本身设置有问题
6、关于向jsapi.php传参的问题:
由于微信支付本身需要在只有在微信浏览器中打开的网页才能起作用,即jsapi.php中$openId = $tools->GetOpenid();此行代码进行了一个页面跳转,造成了传来的一些例如商品描述,金额等关键信息丢失。
①jsapi.php需要在GetOpenid()之前对发来的信息进行收集,所做项目的此处代码:
1 //获取post来的数据 2 $body = $_POST[‘body‘]; 3 $address = $_POST[‘address‘]; 4 $total_fee = $_POST[‘total_fee‘]*100; 5 $id = $_POST[‘id‘]; 6 7 //①、获取用户openid 8 $tools = new JsApiPay(); 9 $openId = $tools->GetOpenid($body,$address,$total_fee,$id);
②修改WxPay.JsApiPay.php中的GetOpenId()方法,将传递来的参数通过state参数进行传递,此处代码
1 public function GetOpenid($body,$address,$total_fee,$id) 2 { 3 //通过code获得openid 4 if (!isset($_GET[‘code‘])){ 5 //触发微信返回code码 6 $baseUrl = urlencode(‘http://‘.$_SERVER[‘HTTP_HOST‘].$_SERVER[‘PHP_SELF‘].$_SERVER[‘QUERY_STRING‘]); 7 $url = $this->__CreateOauthUrlForCode($baseUrl); 8 //将用户传来的参数使用STATE参数进行传递 9 $state = json_encode(array( 10 "body" => $body, 11 "address" => $address, 12 "total_fee" => "$total_fee", 13 "id" => $id 14 )); 15 $url = str_replace("STATE", $state, $url); 16 Header("Location: $url"); 17 exit(); 18 }else { 19 //获取code码,以获取openid 20 $code = $_GET[‘code‘]; 21 $openid = $this->getOpenidFromMp($code); 22 return $openid; 23 } 24 }
③在jsapi.php中的GetOpenId()后面对关键信息进行提取,此处代码
1 //获取传递的用户参数 2 $info = $_GET[‘state‘]; 3 $info = json_decode($info); 4 5 $body = $info ->body; 6 $address = $info ->address; 7 $total_fee = $info ->total_fee; 8 $id = $info ->id;
之后再进行统一下单即可
7、支付成功后的回调方法
在jsapi.php中的jsApiCall()方法中修改,相关代码如下
1 function jsApiCall() 2 { 3 WeixinJSBridge.invoke( 4 ‘getBrandWCPayRequest‘, 5 <?php echo $jsApiParameters; ?>, 6 function(res){ 7 if (res.err_msg == "get_brand_wcpay_request:ok"){ 8 // message: "微信支付成功!" 9 //微信支付成功的回调方法 10 11 }else if (res.err_msg == "get_brand_wcpay_request:cancel") { 12 // message: "已取消微信支付!" 13 //取消支付的回调方法 14 alert(‘您已取消支付!‘); 15 window.history.go(-1); 16 } 17 } 18 ); 19 }
以上。
标签:
原文地址:http://www.cnblogs.com/likaopu/p/5552053.html