微信官方说明地址:

【微信支付】付款开发者文档微信支付付款,提供企业向用户付款的功能,支持企业通过API接口付款,或通过微信支付商户平台网页功能操作付款https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1

第一步:微信商户平台配置

第二步:接口对接

接口调用请求说明:

第三步:接口开发(这里使用的是PHP)

当时开发时,就写了一个类作为服务。代码可以直接使用。
说明:里面的配置项需要换成你们自己的。

class WeChatPayService
{/*** 代码版本号* @var string*/public static $version = "1.0.0";private $payReqUrl = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';/*** KEY:商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置), 请妥善保管, 避免密钥泄露* 设置地址:https://pay.weixin.qq.com/index.php/account/api_cert** APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置), 请妥善保管, 避免密钥泄露* 获取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN** mchAppId:申请商户号的appid或商户号绑定的appid** mchId:微信支付分配的商户号** $sslCertPath:cert 与 key 分别属于两个.pem文件(证书文件请放入服务器的非web目录下)* @var string*/private $key         = '';private $appId       = '';private $appSecret   = '';private $mchAppId    = '';private $mchId       = '';private $sslCertPath = "";private $sslKeyPath  = "";/*** 构造函数*/public function __construct( ){}/*** @Description //TODO 支付方法* @param array $requestParams  [请求接口需要的参数]* @return array    $formatRes  [业务结果]**/public function payMethod($requestParams){try{//获取公参$publicParams = self::getPublicParams();$publicParams['partner_trade_no'] = $requestParams['partner_trade_no'];$publicParams['openid'] = $requestParams['openid'];$publicParams['amount'] = $requestParams['amount'];$publicParams['desc']   = $requestParams['desc'];$publicParams['sign'] = $this->getSignature($publicParams);$xml = $this->toXml($publicParams);Log::info("postXmlCurl请求参数=>" . json_encode($publicParams,JSON_UNESCAPED_UNICODE));//请求接口$response = self::postXmlCurl( $xml, $this->payReqUrl, false);//模拟接口返回的数据格式$response = '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[获取成功]]></return_msg><result_code><![CDATA[SUCCESS]]></result_code><mchid>10000098</mchid><mch_appid><![CDATA[wxe062425f740c30d8]]></mch_appid><detail_id><![CDATA[1000000000201503283103439304]]></detail_id><partner_trade_no><![CDATA[1000005901201407261446939628]]></partner_trade_no><status><![CDATA[SUCCESS]]></status><payment_amount>650</payment_amount ><openid ><![CDATA[oxTWIuGaIt6gTKsQRLau2M0yL16E]]></openid><payment_time><![CDATA[2015-04-21 20:00:00]]></payment_time><transfer_name ><![CDATA[测试]]></transfer_name ><desc><![CDATA[福利测试]]></desc></xml>';$response = $this->formatXml($response);print_r($response);}catch(\Exception $exception){Log::error( "支付异常=>" . $exception->getMessage() . "|xml=>" . json_encode( $response ) );return false;}}/*** @Description //TODO 获取支付公参* @param* @return array    $publicParams**/private function getPublicParams(){$publicParams = ['mch_appid'  => $this->mchAppId,'mchid'      => $this->mchId,'nonce_str'  => self::getNonceStr(),'check_name' => 'NO_CHECK', //NO_CHECK:不校验真实姓名  FORCE_CHECK:强校验真实姓名];return $publicParams;}/*** @Description //TODO 对数据签名* @param   array   $signData   [待签名的数据]* @return string   $sing       [MD5后的值]**/private function getSignature( $signData ){//签名步骤一:按字典序排序参数ksort( $signData );$string = $this->toUrlParams( $signData );//签名步骤二:在string后加入KEY$string = $string . "&key=" . $this->key;$sing   = md5( $string );//签名步骤四:所有字符转为大写$sing = strtoupper( $sing );return $sing;}/*** @Description //TODO 格式化参数格式化成url参数* @param array $data   [待格式化的数据]* @return array    $buff   [格式化后的数据]**/private function toUrlParams($data){$buff = "";foreach ($data as $k => $v){if($k != "sign" && $v != "" && !is_array($v)){$buff .= $k . "=" . $v . "&";}}$buff = trim($buff, "&");return $buff;}/*** @Description //TODO 输出xml字符* @param array $data    [待转换成xml格式的数组]* @return xml  $xml     [数组装换成xml的结果]**/private function toXml( $data ){try{$xml = "<xml>";foreach( $data as $key => $val ){if( is_numeric( $val ) ){$xml .= "<" . $key . ">" . $val . "</" . $key . ">";} else{$xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";}}$xml .= "</xml>";return $xml;} catch( \Exception $exception ){Log::error( "输出xml字符异常=>" . $exception->getMessage() . "|xml=>" . json_encode( $data ) );}}/*** @Description //TODO 将xml转为array* @param   xml   $xml    [xml格式的数据]* @return  array    $data   [转换后的数据]**/private function formatXml($xml){try{//禁止引用外部xml实体libxml_disable_entity_loader(true);$data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);return $data;}catch(\Exception $exception){Log::error("xml数据异常=>" . $exception->getMessage() . "|xml=>" . json_encode($xml));return [];}}/*** @Description //TODO 产生随机字符串,不长于32位* @param int $length   [需要生成的长度]* @return string   $str [产生的随机字符串]**/private static function getNonceStr($length = 32){$chars = "abcdefghijklmnopqrstuvwxyz0123456789";$str ="";for ( $i = 0; $i < $length; $i++ )  {$str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);}return $str;}/*** @Description //TODO 获取毫秒级别的时间戳* @param* @return**/private static function getMillisecond(){//获取毫秒的时间戳$time  = explode( " ", microtime() );$time  = $time[ 1 ] . ( $time[ 0 ] * 1000 );$time2 = explode( ".", $time );$time  = $time2[ 0 ];return $time;}/*** @Description //TODO 置商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号* @param* @return string   $tradeNo  [订单号]**/private static function getTradeNo(){$date = date('YmdHis');$tradeNo = $date . self::getNonceStr(10);return $tradeNo;}/*** @Description //TODO 以post方式提交xml到对应的接口url* @param string $xml  [需要post的xml数据]* @param string $url  [url]* @param bool $useCert [是否需要证书,默认需要]* @param int $second   [url执行超时时间,默认30s]* @return**/private function postXmlCurl( $xml, $url, $useCert = true, $second = 30 ){$data = [];try{$ch          = curl_init();$curlVersion = curl_version();$ua          = "WXPaySDK/" . self::$version . " (" . PHP_OS . ") PHP/" . PHP_VERSION . " CURL/" . $curlVersion[ 'version' ] . " ". $this->mchId;//设置超时curl_setopt( $ch, CURLOPT_TIMEOUT, $second );curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $second );$proxyHost = "0.0.0.0";$proxyPort = 0;//如果有配置代理这里就设置代理if( $proxyHost != "0.0.0.0" && $proxyPort != 0 ){curl_setopt( $ch, CURLOPT_PROXY, $proxyHost );curl_setopt( $ch, CURLOPT_PROXYPORT, $proxyPort );}curl_setopt( $ch, CURLOPT_URL, $url );curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, TRUE );curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 2 );//严格校验curl_setopt( $ch, CURLOPT_USERAGENT, $ua );//设置headercurl_setopt( $ch, CURLOPT_HEADER, FALSE );//要求结果为字符串且输出到屏幕上curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE );if( $useCert == true ){//设置证书//使用证书:cert 与 key 分别属于两个.pem文件//证书文件请放入服务器的非web目录下$sslCertPath = $this->sslCertPath;$sslKeyPath  = $this->sslKeyPath;curl_setopt( $ch, CURLOPT_SSLCERTTYPE, 'PEM' );curl_setopt( $ch, CURLOPT_SSLCERT, $sslCertPath );curl_setopt( $ch, CURLOPT_SSLKEYTYPE, 'PEM' );curl_setopt( $ch, CURLOPT_SSLKEY, $sslKeyPath );}//post提交方式curl_setopt( $ch, CURLOPT_POST, TRUE );curl_setopt( $ch, CURLOPT_POSTFIELDS, $xml );//运行curl$data = curl_exec( $ch );// 打印请求的header信息$rtn   = curl_getinfo( $ch, CURLINFO_HTTP_CODE );$error = curl_errno( $ch );if( $error ){Log::info( "postXmlCurl error=>" . $rtn . "|错误信息=>" . json_encode( $error, JSON_UNESCAPED_UNICODE ) . "|响应结果=>" . json_encode( $data ) );}//返回结果curl_close( $ch );return $data;} catch( \Exception $exception ){Log::error( "postXmlCurl异常=>" . $exception->getMessage() . "|xml=>" . json_encode( $xml ) );return $data;}}
}

代码如果对你有所帮助,请留下你的赞(*^▽^*)!

微信支付-付款到零钱开发流程相关推荐

  1. 【微信支付付款至零钱】

    微信支付付款至零钱--如何生成正确的签名sign 欢迎观看--xpx分享 注意以下几点 第一点:整理好 请求参数格式 第二点:对参数按照key=value的格式,并按照参数名ASCII字典序排序生成字 ...

  2. 微信支付、微信企业付款到零钱工具类

    微信支付.微信企业付款到零钱工具类 主要依赖:apache httpclient 4.5 jdk1.8 工具类主要功能: xml参数拼接 签名算法实现 post加密请求 import lombok.e ...

  3. 微信零钱数据在服务器,关于微信企业付款到零钱X509Certificate2读取证书信息,发布到服务器访问不到的解决方案...

    前言: 最近做了一个通过调用微信企业付款到用户零钱的功能,真的挺奇怪的,在我本地调试的时候都没有问题,但是当我发布到服务上的时候却一直无法读取到我的证书信息.读取的代码如下,使用的是微信官方文档提供的 ...

  4. JAVA微信企业付款到零钱(十分钟搞定),附完整DEMO下载

    最近帮朋友做了一个简单的微分销系统,实现从企业付款到零钱分润的功能,简单记录一下微信提现功能开发的流程, 主要就是按规则封装好请求参数调用微信接口,涉及一些签名校验: A.接口流程 获取用户OPENI ...

  5. 微信企业付款到零钱(微信提现)

    由于项目中要用到微信提现,参考网上代码和官方文档写了提现的工具类 用到的相关类库 dom4j commons-lang3 httpclient-4.4.1 具体相关流程可以看微信企业付款到零钱的开发文 ...

  6. java零钱换整程序_JAVA微信企业付款到零钱(十分钟搞定),

    JAVA微信企业付款到零钱(十分钟搞定), 最近帮朋友做了一个简单的微分销系统,实现从企业付款到零钱分润的功能,简单记录一下微信企业付款到零钱的开发过程, 主要就是按规则封装好请求参数调用微信接口,涉 ...

  7. 微信企业付款到零钱功能介绍

    微信企业付款到零钱功能介绍 一.企业付款至零钱业务介绍 企业付款业务是为了协助商户方便地实现企业向个人付款,针对部分有开发能力的商户,通过API或网页操作,付款至目标用户(企业可根据APPID+Ope ...

  8. 微信小程序获取用户手机号码,Java后台servlet解密(微信小程序调用微信支付也是大致的流程)

    本篇记录说明 微信小程序获取用户手机号码,Java后台servlet解密(微信小程序调用微信支付也是大致的流程,详细内容可私信交流) (第一次写博客,写得不好的地方见谅,面向新手,大佬请无视,不喜勿喷 ...

  9. 微信企业付款到零钱出现请提交付款接口调用IP

    最近开通了微信企业付款到零钱产品,相关的支付域名都配置,可以在提交IP时候一直提示 请提交付款接口调用IP 错误,查阅了官网很多资料,有的说要填写出口IP,明明填写的是服务器的IP地址,缺一直提示这个 ...

最新文章

  1. JavaScript强化教程-JS面向对象编程
  2. 软考-信息系统项目管理师-项目管理成熟度模型
  3. USTC English Club Note20171015(5)
  4. 办学10年,进入全国前10名!这所神奇的高校,迎来10岁生日
  5. BLOB,TEXT GEOMETRY or JSON column 'xxx' can't have a default value query问题解决
  6. Redis系列-主从复制配置
  7. 清北学堂模拟赛d1t1 位运算1(bit)
  8. MySQL的常用SQL脚本
  9. 十大经典算法总结(JavaScript描述)
  10. 基于Python的Landsat影像建设用地自动识别与提取
  11. 软件测试基础知识 + 面试理论(超详细)
  12. 三、用python实现平稳时间序列的建模
  13. matlab 线型、标记、颜色
  14. Vue--基础模板语法以及计算属性
  15. 华硕无线网卡测试软件,高端便携无线网卡来了 华硕USB-AC68首测
  16. 斗兽棋项目开发计划书
  17. 如何用好示波器?资深工程师也会忽略这些细节……
  18. 动态图GIF动态图怎么做?上传动态效果图到你的csdn?
  19. 如何在MySQL中查找数据
  20. ThingsBoard安装

热门文章

  1. PX4中文维基汉化项目启动
  2. 程序人生,精彩抢先看
  3. 技术人如何利用 github+Jekyll ,搭建一个独立免费的技术博客
  4. mysql optimizer mrr_mysql 索引优化特性之MRR
  5. gre模考软件java.exe_GRE模考软件PP2注册下载方式
  6. 话剧的一般内容及一份话剧台词
  7. 用Python实现定时自动化收取蚂蚁森林能量,再也不用担心忘记收取了
  8. 今天狠狠的学一下Java设计模式!
  9. Maya机器人社区项目批渲染问题
  10. 抖音教育类短视频爆火,5个起标题的模板,4个选择封面的原则