首页 > 代码库 > 微信支付——开发体系
微信支付——开发体系
有了微信支付方面的一些前期准备以及理论知识后,我们可以开始打造我们的微信支付平台了。
商户向微信公众号提供企业以及银行账户资料,商户功能审核通过后,可以获得以下账户包括财付通的商户账户,用于公众号支付
appId
公众号身份的唯一标识。
paySignKey
公众号支付请求中用于加密的密钥Key,可验证商户唯一身份,PaySignKey对应于支付场景中的appKey值。
appSecret
除了支付请求需要用到paySignKey,公众平台接口API 的权限获取所需密钥Key,在使用所有公众平台API 时,都需要先用它去换取access_token,然后再进行调用(详情参考文档API 接口部分)。
partnerId
财付通商户身份的标识。
partnerKey
财付通商户权限密钥Key。
其中:appSecret、paySignKey、partnerKey是验证商户唯一性的安全标识,对于appSecret和paySignKey的区别,可以这样认为:appSecret是API使用时的登录密码,会在网络中传播的,而paySignKey是在所有支付相关数据传输时用于加密并进行身份校验的密钥,仅保留在第三方后台和微信后台,不会在网络中传播,而且paySignKey仅用于支付请求。
JS API(网页内)支付接口
根据支付场景的交互细节,来设计商户页面的逻辑
(1)用户打开商户网页选购商品,发起支付,在网页通过javascript调用getBrandWCPayRequest接口,发起微信支付请求,用户进入支付流程。
(2)用户成功支付点击完成按钮后,商户的前端会收到javascript的返回值。商户直接跳转支付成功的静态页面进行展示。
(3)商户后台收到来自微信开放平台的支付成功回调通知,标志该笔订单支付成功。
微信JS API只能在微信内置浏览器中使用,其他浏览器调用无效。js的判断方法为:
<span style="white-space:pre"> </span>if(typeof WeixinJSBridge === 'undefined') { alert('微信支付必须在微信内置浏览器中使用.'); return; }
微信提供getBrandWCPayRequest接口供商户前端网页调用,调用之前微信会鉴定商户支付权限,若商户具有调起支付的权限,则将开始支付流程。接口注意:所以传入参数都是字符串类型!
getBrandWCPayRequest参数以及返回值定义
参数 | 名称 | 必填 | 格式 | 说明 |
appId | 公众号id | 是 | 字符串类型 | 商户注册具有支付权限的公众号成功后即可获得; |
timeStamp | 时间戳 | 是 | 字符串类型,32个字节以下 | 商户生成,从1970年1月1日00:00:00至今的秒数,即当前的时间,且最终需要转换为字符串形式; |
nonceStr | 随机字符串 | 是 | 字符串类型,32个字节以下 | 商户生成的随机字符串; |
package | 订单详情扩展字符串 | 是 | 字符串类型,4096个字节以下 | 商户将订单信息组成该字符串,具体组成方案参见接口使用说明中package组包帮劣;由商户按照规范拼接后传入; |
signType | 签名方式 | 是 | 字符串类型,参数取值"SHA1" | 按照文档中所示填入,目前仅支持SHA1; |
paySign | 签名 | 是 | 字符串类型 | 商户将接口列表中的参数按照指定方式迚行签名,签名方式使用signType中标示的签名方式,具体签名方案参见接口使用说明中签名帮劣;由商户按照规范签名后传入; |
返回值是:
err_msg | get_brand_wcpay_request:ok | 支付成功 |
get_brand_wcpay_request:cancel | 支付过程用户取消 | |
get_brand_wcpay_request:fail | 支付失败 |
根据官方文档,将相关的函数和方法做了封装,代码如下:
<?php /** * Description of weixinPayHelper * * @author kewin */ class weixinPayHelper { public $appId = ""; public $appSecret = ""; public $partnerId = ""; public $paySignKey = ""; public $partnerKey = ""; public $token = ""; public function __construct($appId, $appSecret, $partnerId, $paySignKey, $partnerKey, $token) { $this->appId = $appId; $this->appSecret = $appSecret; $this->partnerId = $partnerId; $this->paySignKey = $paySignKey; $this->partnerKey = $partnerKey; $this->token = $token; } /** * * @param type $api_url * @return boolean */ public function open_request($api_url, $data) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); if (!empty($data)) { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); } $ret = curl_exec($ch); $error = curl_errno($ch); curl_close($ch); if ($error) { return false; } return $ret; } /** * 对数组排序 * @param type $para 排序前的数组 * @return type 排序后的数组 */ public function argsort($para) { ksort($para); reset($para); return $para; } /** * 把数组所有元素按照"参数=参数值"的模式用&字符拼接成字符串 * @param type $para * @return type */ public function createlinkstring($para) { $args = ""; foreach ($para as $key => $val) { $args .= strtolower($key) . "=" . $val . "&"; } //去掉最后一个&字符 if (strlen($args) > 0) { $args = substr($args, 0, count($args) - 2); } //如果存在转义字符,那么去掉转义 if (get_magic_quotes_gpc()) { $args = stripcslashes($args); } return $args; } /** * 除去数组中的空值和签名参数 * @param type $para * @return type */ public function parafilter($para) { $para_filter = array(); foreach ($para as $key => $val) { if ($key == "sign_method" || $key == "sign" || $val == "") { continue; } else { $para_filter[$key] = $para[$key]; } } return $para_filter; } /** * 创建sign * @param type $arr * @return type */ public function create_sign($arr) { $para = $this->parafilter($arr); $_signValue = http://www.mamicode.com/$this->argsort($para);>
有了工具类后,就可以开始我们的支付流程过程需要的函数调用了, 附上一个微信支付的demo——pay.php
<?php /** * [WeEngine System] Copyright (c) 2013 WE7.CC * kewin */ require '/www/web/weixin.shike001.com/source/bootstrap.inc.php'; include '../../source/class/weixinPayHelper.class.php';取得公众号的一下数据$appid $secret $partnerId $paySignKey $partnerKey $token $weixin = new weixinPayHelper($appid, $secret, $partnerId, $paySignKey, $partnerKey, $token); $body = $_GET['title']; $fee = $_GET['fee']*100; $create_ip = $_W['clientip']; $data = http://www.mamicode.com/array(><span style="white-space:pre"> </span>window.location.href=http://www.mamicode.com/"";>
但此时要注意一个问题,微信的授权目录和请求路径已经固定,所以pay.php需要是请求调用的而不能是直接包含进某个功能块的,在这里我们可以跳转到支付页面,连接后面跟上需要的参数
至此,可以实现付款了。
微信支付——开发体系