payment 项目2.0版本 php
微信的支付逻辑与支付宝的支付有一些差异。为了让客户端忽略这些差异,统一调用。本sdk作了对应处理。html
# SDK调用git
微信支付不一样接口须要的参数会有差异。请你们在使用接口时,仔细查看文档。github
use Payment\ChargeContext; use Payment\Config; use Payment\Common\PayException; // 微信支付,必须设置时区,不然发生错误 date_default_timezone_set('Asia/Shanghai'); // 生成订单号 便于测试 function createPayid() { return date('Ymdhis', time()).substr(floor(microtime()*1000),0,1).rand(0,9); } // 订单信息 $payData = [ "order_no" => createPayid(), "amount" => '0.01',// 单位为元 ,最小为0.01 "client_ip" => '127.0.0.1', "subject" => '测试支付', "body" => '支付接口测试', "extra_param" => '', ]; // 微信扫码支付,须要设置的参数 $payData['product_id'] = '123456'; // 微信公众号支付,须要的参数 $payData['openid'] = 'otijfvr2oMz3tXnaQdKKbQeeBmhM';// 须要经过微信提供的api获取该openid /** * 包含客户的配置文件 * 本次 2.0 版本,主要的改变是将配置文件独立出来,便于客户多个帐号的状况 * 已经使用不一样方式读取配置文件,如:db file cache等 */ $wxconfig = [ 'app_id' => 'wxxxx', // 公众帐号ID 'mch_id' => 'xxxx',// 商户id 'md5_key' => 'xxxxxx',// md5 秘钥 'notify_url' => 'http://test.helei.com/pay-notify.html', 'time_expire' => '14', // 涉及资金流动时,须要提供该文件 'cert_path' => dirname(__FILE__) . DIRECTORY_SEPARATOR . 'wx' . DIRECTORY_SEPARATOR . 'apiclient_cert.pem', 'key_path' => dirname(__FILE__) . DIRECTORY_SEPARATOR . 'wx' . DIRECTORY_SEPARATOR . 'apiclient_key.pem', ]; /** * 实例化支付环境类,进行支付建立 */ $charge = new ChargeContext(); try { // 微信 扫码支付 $type = Config::WX_CHANNEL_QR; // 微信 APP支付 //$type = Config::WX_CHANNEL_APP; // 微信 公众号支付 //$type = Config::WX_CHANNEL_PUB; $charge->initCharge($type, $wxconfig); $ret = $charge->charge($payData); } catch (PayException $e) { echo $e->errorMessage();exit; } if ($type === Config::WX_CHANNEL_QR) { $url = urlencode($ret); echo "<img alt='扫码支付' src='http://paysdk.weixin.qq.com/example/qrcode.php?data={$url}' style='width:150px;height:150px;'/>"; } elseif ($type === Config::WX_CHANNEL_PUB) { $json = $ret; var_dump($json);exit; } elseif (stripos($type, 'wx') !== false) { var_dump($ret); } ?>
这里扫码支付与公众号支付分别须要提供不一样的参数。请必定注意进行区分。不然调用相应端口会抛出异常。数据库
参数 | 参数名 | 参数说明 | 是否必须 |
---|---|---|---|
app_id | 公众帐号ID/应用id | 微信分配的公众帐号ID | 是 |
mch_id | 商户号 | 微信支付分配的商户号 | 是 |
md5_key | 加密的key | 在商户中心设置 | 是 |
notify_url | 通知地址 | 接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。 | 是 |
time_expire | 交易过时时间 | 单位为分钟,过时后没法再次支付 | 是 |
cert_path | 密钥文件 | 可在微信商户后台中下载 | 否,退款须要 |
key_path | 密钥文件 | 可在商户中心下载 | 否,退款须要 |
这里须要注意的是,app_id,因为微信的三个支付接口,须要对应两个不一样的app_id。所以再开发中必定要注意。json
参数 | 参数名 | 参数说明 | 是否必须 |
---|---|---|---|
order_no | 订单号 | 平台根据规则生成的订单号,最长64位,要在商户数据库中惟一 | 必须 |
amount | 交易总金额 | 该笔订单的资金总额,单位为RMB-Yuan。取值范围为[0.01,100000000.00],精确到小数点后两位。 | 必须 |
client_ip | 客户端IP | 用户在建立交易时,该用户当前所使用机器的IP。 | 必须 |
subject | 商品名称 | 商品的标题/交易标题/订单标题/订单关键字等。该参数最长为128个汉字。 | 必须 |
body | 商品描述 | 对一笔交易的具体描述信息。若是是多种商品,请将商品描述字符串累加传给body。 | 必须 |
extra_param | 公用回传参数 | 若是用户请求时传递了该参数,则返回给商户时会回传该参数。 | 可选 |
product_id | 商品ID | 扫码支付,此参数必传。此id为二维码中包含的商品ID,商户自行定义。 | 可选 |
openid | 用户标识 | 公众号支付,此参数必传,用户在商户appid下的惟一标识。 | 可选 |
三种支付方式返回值由于处理方式不一样,微信方面返回了不一样的类型。api
app支付返回了须要调用的数组。调用客户端的方式 查看微信文档数组
扫码支付返回了一个地址。可生成一个二维码,完成支付。微信
公众号支付,返回的是一个json数据。可直接放入微信的sdk完成jsapi调用。app