微信支付
2019-05-23 本文已影响0人
涳_de26
下载微信支付SDK包,快速搭建支付 下载地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
1.微信扫码支付
/**
* 生成支付代码
* @param array $order 订单信息
* @param array $config 支付方式信息
*/
function get_code($order, $config)
{
$notify_url = SITE_URL . '/index.php/app/notify_url'; // 接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。
$input = new WxPayUnifiedOrder();
$input->SetBody($config['body']); // 商品描述
$input->SetAttach("weixin"); // 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
$input->SetOut_trade_no($order['order_sn'] . time()); // 商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
$input->SetTotal_fee($order['order_amount'] * 100); // 订单总金额,单位为分,详见支付金额
$input->SetNotify_url($notify_url); // 接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。
$input->SetTrade_type("NATIVE"); // 交易类型 取值如下:JSAPI,NATIVE,APP,详细说明见参数规定 NATIVE--原生扫码支付
$input->SetProduct_id("123456789"); // 商品ID trade_type=NATIVE,此参数必传。此id为二维码中包含的商品ID,商户自行定义。
$notify = new NativePay();
$result = $notify->GetPayUrl($input); // 获取生成二维码的地址
$url2 = $result["code_url"];
if (empty($url2))
return '没有获取到支付地址, 请检查支付配置' . print_r($result, true);
return '<img alt="模式二扫码支付" src="/index.php?m=Home&c=Index&a=qr_code&data='.urlencode($url2).'" style="width:110px;height:110px;"/>';
}
2微信公众号支付
function getJSAPI($order)
{
if(stripos($order['order_sn'],'recharge') !== false){
$go_url = U('Mobile/User/points',array('type'=>'recharge'));
$back_url = U('Mobile/User/recharge',array('order_id'=>$order['order_id']));
}else{
$go_url = U('Mobile/Order/order_detail',array('id'=>$order['order_id']));
$back_url = U('Mobile/Cart/cart4',array('order_id'=>$order['order_id']));
}
//①、获取用户openid
$tools = new JsApiPay();
//$openId = $tools->GetOpenid();
$openId = $_SESSION['openid'];
//②、统一下单
$input = new WxPayUnifiedOrder();
$input->SetBody("支付订单:".$order['order_sn']);
$input->SetAttach("weixin");
$input->SetOut_trade_no($order['order_sn'].time());
$input->SetTotal_fee($order['order_amount']*100);
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag("tp_wx_pay");
$input->SetNotify_url(SITE_URL.'/index.php/Home/Payment/notifyUrl/pay_code/weixin');
$input->SetTrade_type("JSAPI");
$input->SetOpenid($openId);
$order2 = WxPayApi::unifiedOrder($input);
//echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';
//printf_info($order);exit;
$jsApiParameters = $tools->GetJsApiParameters($order2);
$html = <<<EOF
<script type="text/javascript">
//调用微信JS api 支付
function jsApiCall()
{
WeixinJSBridge.invoke(
'getBrandWCPayRequest',$jsApiParameters,
function(res){
//WeixinJSBridge.log(res.err_msg);
if(res.err_msg == "get_brand_wcpay_request:ok") {
location.href='$go_url';
}else{
alert(res.err_code+res.err_desc+res.err_msg);
location.href='$back_url';
}
}
);
}
function callpay()
{
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', jsApiCall);
document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
}
}else{
jsApiCall();
}
}
callpay();
</script>
EOF;
return $html;
}
2微信小程序支付
/**
* 生成支付代码
* @param array $order 订单信息
* @param array $config 支付方式信息
*/
function get_code($order, $config)
{
$user = session('user');
$openid = $user['openid'];
$notify_url = SITE_URL . '/api/mini/notify_url'; // 接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。
$input = new WxPayUnifiedOrder();
if (empty($config['body'])){
$config['body'] = '买东西了!';
}
$input->SetBody($config['body']); // 商品描述
$input->SetOut_trade_no($order['order_sn']); // 商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
$input->SetTotal_fee($order['order_amount'] * 100); // 订单总金额,单位为分,详见支付金额
$input->SetNotify_url($notify_url); // 接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。
$input->SetOpenid($openid); //付款人的openid
$input->SetTrade_type('JSAPI');
// echo $notify_url;exit;
try {
$return = WxPayApi::unifiedOrder($input);
} catch (\Exception $e) {
throw new JsonErrorException($e->getMessage());
}
$time = time();
$tmp=[];
if ($return['return_code'] == 'FAIL' || $return['result_code'] == 'FAIL'){
$msg = $return['return_msg'];
if ($msg == 'OK'){
$msg = $return['err_code_des'];
}
throw new JsonErrorException($msg);
}
//组装数据给小程序吊起支付
$tmp['appId'] = WxPayConfig::$appid;
$tmp['nonceStr'] = $this->getNonceStr();
$tmp['package'] = 'prepay_id='.$return['prepay_id'];
$tmp['signType'] = 'MD5';
$tmp['timeStamp'] = "$time";
$tmp['paySign'] = $this->MakeSign($tmp,WxPayConfig::$key);
return $tmp;
}
3.微信app支付
/**
* 生成支付代码
* @param array $order 订单信息
* @param array $config 支付方式信息
*/
function get_code($order, $config = '')
{
$notify_url = SITE_URL . '/api/app/notify_url'; // 接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。
$input = new WxPayUnifiedOrder();
if (empty($config['body'])){
$config['body'] = '支付描述!';
}
$input->SetBody($config['body']); // 商品描述
$input->SetOut_trade_no($order['order_sn']); // 商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
$input->SetTotal_fee($order['order_amount'] * 100); // 订单总金额,单位为分,详见支付金额
$input->SetNotify_url($notify_url); // 接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。
$input->SetOpenid($openid); //付款人的openid,开放平台的openid
$input->SetTrade_type('APP');
try {
$return = WxPayApi::unifiedOrder($input);
} catch (\Exception $e) {
throw new JsonErrorException($e->getMessage());
}
$time = time();
$tmp=[];
$result = array();
if ($return['return_code'] == 'FAIL'){
throw new JsonErrorException($return['return_msg']);
}
//用于重组数据进行签名
$tmp['appid'] = WxPayConfig::$appid;
$tmp['noncestr'] = $this->getNonceStr();
$tmp['prepayid'] = $return['prepay_id'];
$tmp['package'] = 'Sign=WXPay';
$tmp['timestamp'] = "$time";
$tmp['partnerid'] = WxPayConfig::$mchid;
//重新组装数据给app端
$result['sign'] = $this->MakeSign($tmp,WxPayConfig::$key);
$result['appid'] = $tmp['appid'];
$result['noncestr'] = $tmp['noncestr'];
$result['prepayid'] = $tmp['prepayid'];
$result['packagePay'] = $tmp['package'];
$result['timestamp'] = $tmp['timestamp'];
$result['partnerid'] = $tmp['partnerid'];
return $result;
}
4.微信支付之原路返回
// 微信订单退款原路退回
public function payment_refund($data){
/*code_4支付原路退回逻辑*/
if(!empty($data["transaction_id"])){
$input = new WxPayRefund();
$input->SetTransaction_id($data["transaction_id"]);
$input->SetTotal_fee($data["total_fee"]*100);
$input->SetRefund_fee($data["refund_fee"]*100);
$input->SetOut_refund_no(WxPayConfig::$mchid.date("YmdHis"));
$input->SetOp_user_id(WxPayConfig::$mchid);
return WxPayApi::refund($input);
}else{
return false;
}
/*code_4支付原路退回逻辑*/
}