APP中微信,支付宝支付,退款接口从申请到开发过程

来源:互联网 发布:ie8 f12 没有网络捕获 编辑:程序博客网 时间:2024/04/27 20:46

之前在做公众号开发过程中有集成过微信的支付功能,但是一些帐号相关的申请与设置都由其他同事弄好后提供过来的,最近APP项目中集成微信和支付宝的功能,从相关接口权限和开发都自己亲自走了一遍,不得不说走了不少转路,今天分享下,希望对大家有所帮助吧


1、微信APP支付功能申请流程

     a、打开 https://open.weixin.qq.com/ (微信开发平台)进入商户管理中心,注:这里省去了帐号的注册流程

     b、点击移动应用下面的’创建移动应用‘,创建一个新应用

     c、创建完成后,新应用便会出现在移动应用列表中,可点击查看按钮,进入应用详情页,如下图1,2所示

     

                                                                                                                                         (图1)

        

                                                                                                                 (图2)

     d、APP微信支付接口权限需要申请才能获得,费用300元一次

     e、下载微信SDK包,并将自己对应的商户号,APPid,支付密钥,公众号密钥等相关信息填入到WxPay.Config.php中

     f、有一点需要特别强调下,公众号证书与APP证书不一样,APP支付接口申请下来后,会由到相关邮件,邮件中登录帐号与密码,证书就在这里下载


2、APP支付宝申请流程(支付宝的管理后台整合了比较多系统,入口不好找到)


    a、 打开 https://openhome.alipay.com/platform/manageHome.htm登录支付宝,注:这里省去了帐号的注册流程

    b、点击我有开发能力,进入我的应用页面  https://openhome.alipay.com/platform/appManage.htm

    c、如图3所示,可以对应用进行管理与创建

  

                                                                                                                    (图3)

     d、如图4所示,申请应用所需要的接口权限

 


    e、下载支付宝SDK


3、一切申请通过之后,便可以开始接口的开发了

4、我这边讲解的是PHP作为后,给APP端提供支付接口的流程

      微信大致流程为:APP端将订单信息提交到后台,后台通过微信统一下单接口到微信去下单,微信端返回相关信息到PHP后台,后台先将订单保存到数据库成功后,返回签名信息给APP端去实现真正的支付

    支付宝大致流程为:APP端将订单信息提交到后台,后台通过支付宝规定的签名算法将签名信息返回给APP端,APP端调用支付宝SDK去实现支付

5、下面贴出我在开发过程中用到的代码,不是很规范,但可以借鉴

     

 private function _wxPay($data){        $total_money = 1;        vendor('WxpayAPI.lib.WxPay#Api');        $WxPayApi = new \WxPayApi();        // 商品名称        $subject = '';        $detail="在线支付";        $native="APP";        // 订单号,示例代码使用时间值作为唯一的订单ID号        $out_trade_no = createPayid();        $unifiedOrder = new \WxPayUnifiedOrder();        $WxPayConfig=new \WxPayConfig();        $unifiedOrder->SetBody($subject);//商品或支付单简要描述        $unifiedOrder->SetAppid($WxPayConfig::APPID);//appid        $unifiedOrder->SetMch_id($WxPayConfig::MCHID);//商户标识        $unifiedOrder->SetNonce_str($WxPayApi::getNonceStr($length = 32));//随机字符串        $unifiedOrder->SetDetail($detail);//详情        $unifiedOrder->SetOut_trade_no($out_trade_no);//交易号        $unifiedOrder->SetTotal_fee($data['total_money']*100);//交易金额        $unifiedOrder->SetTrade_type($native);//应用类型        $unifiedOrder->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']);//发起充值的ip        $unifiedOrder->SetNotify_url($WxPayConfig::NOTIFY_URL);//交易成功通知url        //$unifiedOrder->SetTrade_type($native);//支付类型        $unifiedOrder->SetProduct_id(time());        $unifiedOrder->SetTime_start(date('YmdHis'));        $result = $WxPayApi::unifiedOrder($unifiedOrder);        if (is_array($result)) {            if ($result['result_code']=='SUCCESS') {                //将订单信息插入到表中                $order = D('order');                $data['id'] = $out_trade_no;                $data['trade_no'] = $result['prepay_id'];                $data['noncestr'] = $result['nonce_str'];                $order_info = $order->add($data);                $wxpay_result=new \WxPayResults();                $timestamp=time();                $wxpay_result->SetData('appid', $result['appid']);                $wxpay_result->SetData('partnerid', $result['mch_id']);                $wxpay_result->SetData('prepayid', $result['prepay_id']);                $wxpay_result->SetData('timestamp', $timestamp);                $wxpay_result->SetData('noncestr', $result['nonce_str']);                $wxpay_result->SetData('package', 'Sign=WXPay');                $resign_result=$wxpay_result->SetSign();                $back_data=array(                    'result_code'=> C('API_CODE.SUCCESS'),                    'result_msg'=>C('API_CODE.SUCCESS_MSG'),                    'appid'=>$result['appid'],//appid                    'partnerid'=>$result['mch_id'],//商户号                    'prepayid'=>$result['prepay_id'],//与支付id                    'package'=>'Sign=WXPay',                    'noncestr'=>$result['nonce_str'],                    'timestamp'=>$timestamp,                    'sign'=>$resign_result,                );                echo json_encode($back_data);exit();            }        }else{            $back_data = array(                'result_code'=> C('API_CODE.ERROR'),                'result_msg'=>C('API_CODE.ERROR_MSG')            );            echo json_encode($back_data);exit();        }    }
private function _aliPay($data){       // $total_fee = 0.01;        header("Content-type: text/html; charset=utf-8");        vendor('AlipayAPI.AopSdk');        $out_trade_no = createPayid();        //将订单信息插入到表中        $order = D('order');        $data['id'] = $out_trade_no;        $order_info = $order->add($data);        $seller_id = '';              $url = 'http://域名/index.php/Home/order/ali';        $ali = array(            'service' => 'mobile.securitypay.pay',            'partner' => '',//            '_input_charset' => 'utf-8',            'sign_type' => 'RSA',            'sign' => '',            'notify_url' => urlencode($url),//回调地址            'out_trade_no' => $out_trade_no,//商户网站唯一订单号            'subject' => '',//商品名称            'payment_type' => 1,//支付类型            'seller_id' => $seller_id,//支付宝账号            'total_fee' => $data['total_money'],//总金额            'body' => '',//商品详情        );        $ali = $this->argSort($ali);        $str = '';        foreach($ali as  $key => $val){            if($key == 'sign_type' || $key == 'sign'){                continue;            }else{                if($key == ''){                    $str = $key.'='.'"'.$val.'"';                }else{                    $str = $str.'&'.$key.'='.'"'.$val.'"';                }            }        }        $sign = urlencode($this->sign($str));        $str = $str.'&sign='.'"'.$sign.'"'.'&sign_type='.'"'.$ali['sign_type'].'"';//传给支付宝接口的数据        $data = array();        $data['result_code'] = C('API_CODE.SUCCESS');        $data['result_msg'] = C('API_CODE.SUCCESS_MSG');        $data['sign'] = $str;        exit(json_encode($data));    }    function argSort($para) {        ksort($para);        reset($para);        return $para;    }    //RSA签名    function sign($data) {        //读取私钥文件        $priKey = file_get_contents('../cert/rsa_private_key.pem');//私钥文件路径        //转换为openssl密钥,必须是没有经过pkcs8转换的私钥        $res = openssl_get_privatekey($priKey);        //调用openssl内置签名方法,生成签名$sign        openssl_sign($data, $sign, $res);        //释放资源        openssl_free_key($res);        //base64编码        $sign = base64_encode($sign);        return $sign;    }    /**     * 支付宝支付     */    public function ali(){        //file_put_contents('ali.txt',var_export($_REQUEST, true));        $request = $_REQUEST;        if($request['trade_status'] == 'TRADE_SUCCESS'){            //说明支付宝返回支付成功,更新订单表中相关信息            //生成二维码图片            $png = $this->order_scan($request['out_trade_no'],'../Uploads/scan/'.$request['out_trade_no'].'.png');            $order = D('order');            $order_exist = $order->where(array('id'=>$request['out_trade_no']))->find();            if($order_exist['status'] != 8){                $data = array();                $data['trade_no'] = $request['trade_no'];                $data['is_payed'] = 1;                $data['status'] = 2;                $data['order_scan'] = $png;                $data['payed_time'] = date('Y-m-d H:i:s');                $order_info = $order->where(array('id'=>$request['out_trade_no']))->save($data);            }            file_put_contents('sss.txt',var_export($order->getLastSql(), true));        }    }    public function ali_notice(){        echo "success";    }    /**     * 微信支付回调地址     */    public function wx(){        //file_put_contents('sssdfdfd.txt',var_export($GLOBALS["HTTP_RAW_POST_DATA"], true));        vendor('WxpayAPI.lib.WxPay#Api');        //file_put_contents('wx.txt',var_export($GLOBALS["HTTP_RAW_POST_DATA"], true));        $xml = $GLOBALS["HTTP_RAW_POST_DATA"];        $array = (array)simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);        $wxpay=new \WxPayApi();        $notify=new \WxPayNotifyReply();        $WxPayResults = new \WxPayResults();        $result= $WxPayResults->Init($xml);//获取数据并转换为数组        $data = array(            'appid'             =>  $array['appid'],            'mch_id'            =>   $array['mch_id'],            'nonce_str'         =>   $array['nonce_str'],            'result_code'       =>   $array['result_code'],            'openid'            =>   $array['openid'],            'trade_type'        =>   $array['trade_type'],            'bank_type'         =>   $array['bank_type'],            'total_fee'         =>   $array['total_fee'],            'cash_fee'          =>   $array['cash_fee'],            'transaction_id'    =>   $array['transaction_id'],            'out_trade_no'      =>   $array['out_trade_no'],            'time_end'          =>   $array['time_end'],            'sign'              =>    $array['sign']        );        //file_put_contents('sdf.txt',var_export($result, true));        if ($result['return_code']=='SUCCESS' && $result['result_code']=='SUCCESS') {//验签通过           // file_put_contents('ali.txt',var_export(222, true));            $out_trade_no = $array['out_trade_no'];            //生成二维码图片            $png = $this->order_scan($out_trade_no,'../Uploads/scan/'.$out_trade_no.'.png');            $order = D('order');            $data = array();            $data['status'] = 2;            $data['payed_time'] = date('Y-m-d H:i:s');            $data['transaction_id'] = $array['transaction_id'];            $data['third_party_id'] = $array['openid'];            $data['order_scan'] = $png;            $data['is_payed'] = 1;            $res = $order->where(array('id'=>$out_trade_no))->save($data);            if ($res) {                $notify->SetReturn_code('SUCCESS');                $notify->SetReturn_msg('OK');                $notify->SetSign();            }else{                $notify->SetReturn_code('FAIL');                $notify->SetReturn_msg('客户服务器错误');            }        }else{            $notify->SetReturn_code('FAIL');            $notify->SetReturn_msg('微信支付失败');        }        $wxpay->replyNotify($notify->ToXml());    }


6、退款接口开发
/**     * @param $trade_no     * @param $out_trade_no     * @param $transaction_id     * @param $total_fee     * @throws \WxPayException     */    public function wx_refund($trade_no,$out_trade_no,$transaction_id,$total_fee){        vendor('WxpayAPI.lib.WxPay#Api');        //$total_fee=1;        $refund_fee= $total_fee;        $input = new \WxPayRefund();        $WxPayConfig = new \WxPayConfig();        $input->SetTransaction_id($transaction_id);        $input->SetOut_trade_no($out_trade_no);        $input->SetTotal_fee($total_fee*100);        $input->SetRefund_fee($refund_fee*100);        $input->SetOut_refund_no($WxPayConfig::MCHID.date("YmdHis"));        $input->SetOp_user_id($WxPayConfig::MCHID);        $info=\WxPayApi::refund($input);        if($info['return_code']=='SUCCESS'){            $order = D('order');            $order_info = $order->where(array('id'=>$out_trade_no))->save(array('status'=>8));            $data['result_code'] = C('API_CODE.SUCCESS');            $data['result_msg'] = C('API_CODE.SUCCESS_MSG');        }else{            $data['result_code'] = C('API_CODE.ERROR');            $data['result_msg'] = C('API_CODE.ERROR_MSG');        }        exit(json_encode($data));    }

/**     * @param $trade_no     * @param $out_trade_no     * @param $total_fee     * @throws \Exception     */    public function ali_refund($trade_no,$out_trade_no,$total_fee){        //$total_fee = 0.01;        vendor('AlipayAPI.AopSdk');        $aop = new \AopClient();        $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';        $aop->appId = '';              $aop->rsaPrivateKeyFilePath = '../cert/rsa_private_key.pem';        $aop->alipayPublicKey='../cert/alipay_public_key.pem';                $aop->apiVersion = '1.0';        $aop->postCharset='UTF-8';        $aop->format='json';        $request = new \AlipayTradeRefundRequest();        $request->setBizContent("{" .            "    \"out_trade_no\":\"$out_trade_no\"," .            "    \"trade_no\":\"$trade_no\"," .            "    \"refund_amount\":$total_fee" .            "  }");        $result = $aop->execute($request);        $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";        $resultCode = $result->$responseNode->code;        if(!empty($resultCode)&&$resultCode == 10000){            $order = D('order');            $order_info = $order->where(array('id'=>$out_trade_no))->save(array('status'=>8));            $data['result_code'] = C('API_CODE.SUCCESS');            $data['result_msg'] = C('API_CODE.SUCCESS_MSG');        } else {            $data['result_code'] = C('API_CODE.ERROR');            $data['result_msg'] = C('API_CODE.ERROR_MSG');        }        exit(json_encode($data));    }

     

                                             
1 0
原创粉丝点击