关于个人收款问题的解决方案【微信、支付宝、银行卡支付】

很多人都想出售自己的一些产品,课程,电子书,或者其它在线可售卖的东西,但是不管是微信支付还是支付宝,都需要公司账户,这一套不是不可以搞,就是太麻烦了而已。今天介绍的就是不需要公司账号实现个人收款的自动化方案(当然,交易 1% 手续费比微信等略高)。最近在开发违禁词查询的系统的时候发现了这个方案,给大家分享出来。

演示地址可以查看:http://zbxingke.com/demo/douphp/product.php?id=15【直接购买就可以查看效果】


思路是:

环境准备:在有赞开通微小店(免费)-> 注册有赞云 -> 创建自用型应用 -> 绑定微小店 -> 开通 push (推送交易状态)

交易流程:调用有赞云的收银 API ,创建支付二维码(并存储二维码 id 到自有网站订单) -> 用户扫描二维码并支付 -> 推送交易状态到你的网站 -> 更新网站订单状态 -> 完成购买

环境准备

第一步:开通微小店

去这里注册并开通小店:https://h5.youzan.com/v2/index/wxdpc (手机下载客户端开通哦,不是微商城!是微小店,免费的!)

第二步:注册有赞云

去这里注册个人开发者:https://www.youzanyun.com/ ,然后创建自用型应用,填写应用名称,下一步,选择你上面开通的小店名称并完成授权绑定。

file

注意:这里绑定应用的时候是没有微小店选项的,填写完应用名称后下一步是店铺授权,就有你手机上创建的微小店名称可选的。

第三步:开通应用动态推送

这一步主要是接收订单交易状态的,用户发起支付与支付完成都有推送消息,后面我们会介绍如何处理推送。

开通推送的方法:有赞云控制台 -> 应用设置 -> 开发信息 -> 修改 -> 填写接收推送的网址即可。

环境已经准备 OK 了,你的手机上应该已经装了微小店应用了,接下来我们要发起交易,开始之前我们得准备好 SDK,在这里我用的是官方的SDK

https://open.youzan.com/open-sdk/download?type=php&version=2.0.0

开发流程

这里的代码流程如下,如果您是小白也想做这样的功能,那么请联系我购买插件,插件已经开发完毕


1、获取token,持久化保存在数据库

https://www.youzanyun.com/docs/guide/3399/3414

/**
 * 获取token
 */
private function get_token($flush=false){
    global $dou;
    require_once __DIR__ . '/lib/YZGetTokenClient.php';
    $query = $dou->select($dou->table('yz_token'), '*', '`client_id` = \'' . $this->plugin_config['client_id'] . '\'');
    $token_res = $dou->fetch_array($query);


    if(!$token_res){
        $token = new YZGetTokenClient( $this->plugin_config['client_id'] , $this->plugin_config['client_secret'] );
        $type = 'self';
        $keys['kdt_id'] = $this->plugin_config['kdt_id'];
        $res = $token->get_token( $type , $keys );
        if($res['access_token']){
            $access_token = $res['access_token'];
            $expires_in = $res['expires_in'];
            $add_time = time();
            $client_id = $this->plugin_config['client_id'];
            $sql = "INSERT INTO " . $dou->table('yz_token') . " (id,client_id,access_token,expires_in,get_time)" . " VALUES (NULL,'$client_id','$access_token','$expires_in','$add_time')";
            $dou->query($sql);
            return $access_token;
        }
    }else{
        $now = time();
        //token存在数据库
        if(($token_res['get_time']+ $token_res['expires_in']-3600 >= $now) && !$flush ){
            return $token_res['access_token'];
        }else{
            $token = new YZGetTokenClient( $this->plugin_config['client_id'] , $this->plugin_config['client_secret'] );
            $type = 'self';
            $keys['kdt_id'] = $this->plugin_config['kdt_id'];
            $res = $token->get_token( $type , $keys );
            if($res['access_token']){
                $access_token = $res['access_token'];
                $expires_in = $res['expires_in'];
                $add_time = time();
                $client_id = $this->plugin_config['client_id'];
                $sql = "UPDATE " . $dou->table('yz_token') . " SET access_token = '$access_token', 'expires_in' = '$expires_in', get_time = '$add_time'  WHERE client_id = '$client_id'";
                $dou->query($sql);
                return $access_token;
            }

        }
    }
    return '';
}


2.请求二维码

public function work() {
    global $_CFG,$dou;
    require_once __DIR__ . '/lib/YZTokenClient.php';
    $token = $this->get_token();//请填入商家授权后获取的access_token
    $client = new YZTokenClient($token);
    $method = 'youzan.pay.qrcode.create'; //要调用的api名称
    $api_version = '3.0.0'; //要调用的api版本号
    $my_params = [
        'qr_name' => "【$_CFG[site_name]】:{$this->order_sn}",
        'qr_price' => $this->order_amount*100,
        'qr_type' => 'QR_TYPE_DYNAMIC',
        'qr_source' => $this->order_sn
    ];

    $my_files = [
    ];
    $result = $client->post($method, $api_version, $my_params, $my_files);
    $add_time = time();
    $order_sn = $this->order_sn;
    $qr_id = $result['response']['qr_id'];
    $sql = "INSERT INTO " . $dou->table('order_payqr') . " (id,order_sn,qr_id, add_time)" . " VALUES (NULL,'$order_sn','$qr_id','$add_time')";
    $dou->query($sql);
    return $result['response'];
}

3.前端页面显示二维码通过ajax实时检测订单状态

<script>
       var qr_id = '{$payment.qr_id}';
       var url = '{$site.root_url}include/plugin/ypay/check_status.php';
       var order_url = '{$url.order}&order_sn={$order.order_sn}';
       {literal}
       var timer = setInterval(function () {
            $.ajax(
                {
                url:url,
                type:'POST',
                data:{'qr_id':qr_id},
                success:function(result){
                    if(result == 'SUCCESS'){
                     window.alert('恭喜您支付成功。');
                     window.location.href = order_url;
                    }
                }
                }
            );
       },2000);
    {/literal}
</script>


public function check_pay_status($qr_id){
    global $_CFG,$dou;
    require_once (ROOT_PATH . 'include/order.class.php');
    require_once __DIR__ . '/lib/YZTokenClient.php';
    $token = $this->get_token();//请填入商家授权后获取的access_token
    $client = new YZTokenClient($token);
    $method = 'youzan.trades.qr.get'; //要调用的api名称
    $api_version = '3.0.0'; //要调用的api版本号
    $my_params = [
        'qr_id' => $qr_id,
        'status'=>'TRADE_RECEIVED'
    ];
    $my_files = [
    ];
    $result = $client->post($method, $api_version, $my_params, $my_files);
    $res = $result['response'];

    if($res['total_results'] > 0){
        $order_sn = $dou->get_one("SELECT order_sn FROM " . $dou->table('order_payqr') . " WHERE qr_id = '$qr_id'");
        $dou_order = new Order();
        $dou_order->change_status($order_sn,1);
        exit('SUCCESS');
    }
}

4.支付通知处理

$json = file_get_contents('php://input');
$data = json_decode($json, true);

$msg = $data['msg'];
$sign_string = $plugin->get_client_id()."".$msg."".$plugin->get_client_secret();
$sign = md5($sign_string);
if($sign != $data['sign']){
    exit();
}
logging_run($data);
if($data['type'] == "TRADE_ORDER_STATE"  && $data['status'] == "TRADE_SUCCESS"){
    $plugin->notify($data['id']);
}

$result = array("code"=>0,"msg"=>"success") ;
var_dump($result);
public function notify($id){
    global $_CFG,$dou;
    require_once (ROOT_PATH . 'include/order.class.php');
    require_once __DIR__ . '/lib/YZTokenClient.php';
    $token = $this->get_token();//请填入商家授权后获取的access_token
    $client = new YZTokenClient($token);
    $method = 'youzan.trade.get'; //要调用的api名称
    $api_version = '3.0.0'; //要调用的api版本号
    $my_params = [
        'tid' => $id,
    ];
    $my_files = [
    ];
    $result = $client->post($method, $api_version, $my_params, $my_files);
    $res = $result['response'];
    $qr_id = $res['trade']['qr_id'];
    $order_sn = $dou->get_one("SELECT order_sn FROM " . $dou->table('order_payqr') . " WHERE qr_id = '$qr_id'");
    $dou_order = new Order();
    $dou_order->change_status($order_sn,1);
}


本文 暂无 评论

Top
在线咨询 ×

站长QQ:366131726

扫描添加客服微信

工作时间:早8:00 - 晚11:00