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
- APP中微信,支付宝支付,退款接口从申请到开发过程
- 支付宝退款功能开发
- java 微信与支付宝退款接口开发总结
- api 支付宝接口 支付接口 退款接口
- 支付宝退款接口(java)
- 支付宝退款接口(即时到帐有密退款)
- 支付宝退款接口(即时到帐无密退款)
- 支付宝支付接口 APP
- 微信小程序开发(九)小程序支付-申请退款
- 支付宝在线支付接口申请教程
- 微信/支付宝支付接口申请
- java-支付宝支付-支付宝退款
- 微信支付退款接口
- 微信支付退款接口
- 支付宝退款整理
- 支付宝app支付开发
- 支付宝企业账户支付接口申请-移动支付
- 支付宝-即时到账接口开发
- iOS 调用系统相机显示中文标题
- 第一天--React基础使用
- 第十六周项目1-(7)验证算法归并排序
- 第十六周项目三归并算法的改进
- 年末12星座必做的事
- APP中微信,支付宝支付,退款接口从申请到开发过程
- Material Design设计规范
- 不要跟老实人结婚
- Ubuntu 14.04 中 ELK2.*安装
- php初步入门(一)
- Android 6.0获取MAC地址
- 使用SDWebImage直接下载图片
- 关于Fragment调用getActivity的一些问题
- 2016中国软件大会国内外行业顶尖专家、领袖、学者风采抢先看!