关于微信公众号支付tips
2016-06-02 10:11
274 查看
前几日刚刚做完微信公众号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方法在步骤二和步骤四下面进行输出,可以查看生成的签名是否正确
如果有问题,可以在https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1中检查签名,如果签名有错误则证明字段有误,签名与自己的签名一致则可能是前面参数本身设置有问题
6、关于向jsapi.php传参的问题:
由于微信支付本身需要在只有在微信浏览器中打开的网页才能起作用,即jsapi.php中$openId = $tools->GetOpenid();此行代码进行了一个页面跳转,造成了传来的一些例如商品描述,金额等关键信息丢失。
①jsapi.php需要在GetOpenid()之前对发来的信息进行收集,所做项目的此处代码:
②修改WxPay.JsApiPay.php中的GetOpenId()方法,将传递来的参数通过state参数进行传递,此处代码
③在jsapi.php中的GetOpenId()后面对关键信息进行提取,此处代码
之后再进行统一下单即可
7、支付成功后的回调方法
在jsapi.php中的jsApiCall()方法中修改,相关代码如下
以上。
一、关于在公众平台设置的参数
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()之前对发来的信息进行收集,所做项目的此处代码:
//获取post来的数据 $body = $_POST['body']; $address = $_POST['address']; $total_fee = $_POST['total_fee']*100; $id = $_POST['id']; //①、获取用户openid $tools = new JsApiPay(); $openId = $tools->GetOpenid($body,$address,$total_fee,$id);
②修改WxPay.JsApiPay.php中的GetOpenId()方法,将传递来的参数通过state参数进行传递,此处代码
public function GetOpenid($body,$address,$total_fee,$id) { //通过code获得openid if (!isset($_GET['code'])){ //触发微信返回code码 $baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']); $url = $this->__CreateOauthUrlForCode($baseUrl); //将用户传来的参数使用STATE参数进行传递 $state = json_encode(array( "body" => $body, "address" => $address, "total_fee" => "$total_fee", "id" => $id )); $url = str_replace("STATE", $state, $url); Header("Location: $url"); exit(); }else { //获取code码,以获取openid $code = $_GET['code']; $openid = $this->getOpenidFromMp($code); return $openid; } }
③在jsapi.php中的GetOpenId()后面对关键信息进行提取,此处代码
//获取传递的用户参数 $info = $_GET['state']; $info = json_decode($info); $body = $info ->body; $address = $info ->address; $total_fee = $info ->total_fee; $id = $info ->id;
之后再进行统一下单即可
7、支付成功后的回调方法
在jsapi.php中的jsApiCall()方法中修改,相关代码如下
function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', <?php echo $jsApiParameters; ?>, function(res){ if (res.err_msg == "get_brand_wcpay_request:ok"){ // message: "微信支付成功!" //微信支付成功的回调方法 }else if (res.err_msg == "get_brand_wcpay_request:cancel") { // message: "已取消微信支付!" //取消支付的回调方法 alert('您已取消支付!'); window.history.go(-1); } } ); }
以上。
相关文章推荐
- 分享自动抓取缩略图相关文章(微信也有效)
- 微信JSSDK上传多张图片
- 一步一步实现iOS微信自动抢红包(非越狱)
- 微信接口开发缓存全局token,ticket
- 微信接口开发 控制层代码
- 第三方平台微信接口请求代码
- Android中微信抢红包插件原理解析和开发实现
- 关于微信公众号安卓的静态页面缓存问题
- Android支付宝,微信,银联支付支付的集成
- 微信聊天记录导出小试
- 微信支付教程(一)
- 微信开发怎么控制手机返回键问题
- 微信网页开发之概要说明(一)
- Java判断访问设备为手机、微信、PC工具类
- 【微信开发之问题集锦】redirect_uri 参数错误
- PHP微信公众号自动发送红包API
- html textarea标签在苹果OS系统中微信浏览器出现内阴影
- 源码推荐(0601):可高度自定义的TabBarController,微信页面
- Android 平板中 自定义键盘(popuwindow) 居于屏幕左下方 仿微信的密码输入界面
- 微信Token验证失败