8. PHP接入微信的三种支付:APP支付、公众号支付、扫码支付

payment 项目2.0版本

微信的支付逻辑与支付宝的支付有一些差别。为了让客户端忽略这些差别,统一调用。本sdk做了对应处理。

# SDK调用

微信支付不同接口需要的参数会有差别。请大家在使用接口时,仔细查看文档。


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。因此再开发中一定要注意。

请求参数

参数参数名参数说明是否必须
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下的唯一标识。可选

返回值描述

三种支付方式返回值因为处理方式不同,微信方面返回了不同的类型。
* app支付返回了需要调用的数组。调用客户端的方式 查看微信文档
* 扫码支付返回了一个地址。可生成一个二维码,完成支付。
* 公众号支付,返回的是一个json数据。可直接放入微信的sdk完成jsapi调用。

2018-09-03 php服务端微信支付整理SDK,封装,如果喜欢请给个好评!谢谢 说明: 配置在 WeChatConfig文件下 环境:php5.6,基于tp5开发 调用统一下单接口: include_once EXTEND_PATH . 'WeChatSDK/WeChatSDK.php'; $data = $this->getOrderInfo($pay_sn); if (!$data) { return $this->resultCode(-2019, '订单不存在或已支付'); } $WeixinPay = new \WeChatSDK(); if ($trade_type == 'JSAPI') { //目前未有此功能 $openid = ''; $product_id = ''; } if ($trade_type == 'NATIVE') { $openid = ''; $product_id = $pay_sn; } if ($trade_type == 'MWEB') { $openid = ''; $product_id = $pay_sn; } if ($trade_type == 'APP') { $openid = ''; $product_id = $pay_sn; } $out_trade_no = $pay_sn; $result = $WeixinPay->setWeiXinPay($data['pay_body'], $data['pay_detail'], $data['pay_money'] * 100, $out_trade_no, $red_url, $trade_type, $openid, $product_id); APP加密:$WeChatSDK->GetAppParameters($result['data']); web编码 $WeChatSDK->GetMwebApiParameters(); jsapi:WeChatSDK-> GetJsApiParameters(); 回调调用: include_once EXTEND_PATH . 'WeChatSDK/WeChatSDK.php'; Log::write("gwgwgwgw---------------------------------进入异步回掉"); $postStr = file_get_contents('php://input'); Log::write("gwgwgwgw---------------------------------" . $postStr); $WeChatSDK = new \WeChatSDK(); if (!empty($postStr)) { $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $check_sign = $WeChatSDK->checkSign($postObj, $postObj->sign); Log::write('-----check_sign-------' . $check_sign . '------------check_sign--------------'); if ($postObj->result_code == 'SUCCESS' && $check_sign == 1) { model('order', 'service')->affirmPayment($postObj->out_trade_no); $xml = "<xml> <![CDATA[SUCCESS]]></return_co
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值