如何用PHP网站如何实现微信支付付,求教。新手!说明详细点

微信支付统一下单及调起支付接口的php接口实现 - 极乐鸟网站(Will)
现在位置:
>正文_微信支付统一下单及调起支付接口的php接口实现
微信支付统一下单及调起支付接口的php接口实现
新版微信支付(APP支付)没有了服务端demo,并且老版本的php服务端demo也不能使用了,需要商户自己开发来实现。
仔细看了下微信支付提供的接口说明,开发起来也不是那么复杂,完全可以把这些放到一个php中,后续方便其他项目的调用。
参考了csdn的一篇文章及下载资料,先把php代码贴出来。
* 微信支付服务器端下单
* 微信APP支付文档地址:
https://pay./wiki/doc/api/app.php?chapter=8_6
* 使用示例
构造方法参数
//填写微信分配的公众账号ID
//填写微信支付分配的商户号
'notify_url'=&
//填写微信支付结果回调地址
//填写微信商户支付密钥
统一下单方法
$WechatAppPay = new wechatAppPay($options);
$params['body'] = '商品描述';
//商品描述
$params['out_trade_no'] = '1407';
//自定义的订单号,不能重复
$params['total_fee'] = '100';
//订单金额 只能为整数 单位为分
$params['trade_type'] = 'APP';
//交易类型 JSAPI | NATIVE |APP | WAP
$wechatAppPay-&unifiedOrder( $params );
class wechatAppPay
//接口API URL前缀
const API_URL_PREFIX = 'https://api.mch.';
//下单地址URL
const UNIFIEDORDER_URL = "/pay/unifiedorder";
//查询订单URL
const ORDERQUERY_URL = "/pay/orderquery";
//关闭订单URL
const CLOSEORDER_URL = "/pay/closeorder";
//公众账号ID
private $mch_
//随机字符串
private $nonce_
//商品描述
//商户订单号
private $out_trade_
//支付总金额
private $total_
private $spbill_create_
//支付结果回调通知地址
private $notify_
//交易类型
private $trade_
//支付密钥
//证书路径
private $SSLCERT_PATH;
private $SSLKEY_PATH;
//所有参数
private $params = array();
public function __construct($appid, $mch_id, $notify_url, $key)
$this-&appid = $
$this-&mch_id = $mch_
$this-&notify_url = $notify_
$this-&key = $
* 下单方法
$params 下单参数
public function unifiedOrder( $params ){
$this-&body = $params['body'];
$this-&out_trade_no = $params['out_trade_no'];
$this-&total_fee = $params['total_fee'];
$this-&trade_type = $params['trade_type'];
$this-&nonce_str = $this-&genRandomString();
$this-&spbill_create_ip = $_SERVER['REMOTE_ADDR'];
$this-&params['appid'] = $this-&
$this-&params['mch_id'] = $this-&mch_
$this-&params['nonce_str'] = $this-&nonce_
$this-&params['body'] = $this-&
$this-&params['out_trade_no'] = $this-&out_trade_
$this-&params['total_fee'] = $this-&total_
$this-&params['spbill_create_ip'] = $this-&spbill_create_
$this-&params['notify_url'] = $this-&notify_
$this-&params['trade_type'] = $this-&trade_
//获取签名数据
$this-&sign = $this-&MakeSign( $this-&params );
$this-&params['sign'] = $this-&
$xml = $this-&data_to_xml($this-&params);
$response = $this-&postXmlCurl($xml, self::API_URL_PREFIX.self::UNIFIEDORDER_URL);
if( !$response ){
$result = $this-&xml_to_data( $response );
if( !empty($result['result_code']) && !empty($result['err_code']) ){
$result['err_msg'] = $this-&error_code( $result['err_code'] );
* 查询订单信息
* @param $out_trade_no
* @return array
public function orderQuery( $out_trade_no ){
$this-&params['appid'] = $this-&
$this-&params['mch_id'] = $this-&mch_
$this-&params['nonce_str'] = $this-&genRandomString();
$this-&params['out_trade_no'] = $out_trade_
//获取签名数据
$this-&sign = $this-&MakeSign( $this-&params );
$this-&params['sign'] = $this-&
$xml = $this-&data_to_xml($this-&params);
$response = $this-&postXmlCurl($xml, self::API_URL_PREFIX.self::ORDERQUERY_URL);
if( !$response ){
$result = $this-&xml_to_data( $response );
if( !empty($result['result_code']) && !empty($result['err_code']) ){
$result['err_msg'] = $this-&error_code( $result['err_code'] );
* 关闭订单
* @param $out_trade_no
* @return array
public function closeOrder( $out_trade_no ){
$this-&params['appid'] = $this-&
$this-&params['mch_id'] = $this-&mch_
$this-&params['nonce_str'] = $this-&genRandomString();
$this-&params['out_trade_no'] = $out_trade_
//获取签名数据
$this-&sign = $this-&MakeSign( $this-&params );
$this-&params['sign'] = $this-&
$xml = $this-&data_to_xml($this-&params);
$response = $this-&postXmlCurl($xml, self::API_URL_PREFIX.self::CLOSEORDER_URL);
if( !$response ){
$result = $this-&xml_to_data( $response );
* 获取支付结果通知数据
* return array
public function getNotifyData(){
//获取通知的数据
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
$data = array();
if( empty($xml) ){
$data = $this-&xml_to_data( $xml );
if( !empty($data['return_code']) ){
if( $data['return_code'] == 'FAIL' ){
* 接收通知成功后应答输出XML数据
* @param string $xml
public function replyNotify(){
$data['return_code'] = 'SUCCESS';
$data['return_msg'] = 'OK';
$xml = $this-&data_to_xml( $data );
* 生成APP端支付参数
public function getAppPayParams( $prepayid ){
$data['appid'] = $this-&
$data['partnerid'] = $this-&mch_
$data['prepayid'] = $
$data['package'] = 'Sign=WXPay';
$data['noncestr'] = $this-&genRandomString();
$data['timestamp'] = time();
$data['sign'] = $this-&MakeSign( $data );
* 生成签名
@return 签名
public function MakeSign( $params ){
//签名步骤一:按字典序排序数组参数
ksort($params);
$string = $this-&ToUrlParams($params);
//签名步骤二:在string后加入KEY
$string = $string . "&key=".$this-&
//签名步骤三:MD5加密
$string = md5($string);
//签名步骤四:所有字符转为大写
$result = strtoupper($string);
* 将参数拼接为url: key=value&key=value
public function ToUrlParams( $params ){
$string = '';
if( !empty($params) ){
$array = array();
foreach( $params as $key =& $value ){
$array[] = $key.'='.$
$string = implode("&",$array);
* 输出xml字符
返回组装的xml
public function data_to_xml( $params ){
if(!is_array($params)|| count($params) &= 0)
$xml = "&xml&";
foreach ($params as $key=&$val)
if (is_numeric($val)){
$xml.="&".$key."&".$val."&/".$key."&";
$xml.="&".$key."&&![CDATA[".$val."]]&&/".$key."&";
$xml.="&/xml&";
* 将xml转为array
* @param string $xml
* return array
public function xml_to_data($xml){
if(!$xml){
//将XML转为array
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
* 获取毫秒级别的时间戳
private static function getMillisecond(){
//获取毫秒的时间戳
$time = explode ( " ", microtime () );
$time = $time[1] . ($time[0] * 1000);
$time2 = explode( ".", $time );
$time = $time2[0];
* 产生一个指定长度的随机字符串,并返回给用户
* @param type $len 产生字符串的长度
* @return string 随机字符串
private function genRandomString($len = 32) {
$chars = array(
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
"w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
"H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
"S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
"3", "4", "5", "6", "7", "8", "9"
$charsLen = count($chars) - 1;
// 将数组打乱
shuffle($chars);
$output = "";
for ($i = 0; $i & $ $i++) {
$output .= $chars[mt_rand(0, $charsLen)];
* 以post方式提交xml到对应的接口url
* @param string $xml
需要post的xml数据
* @param string $url
* @param bool $useCert 是否需要证书,默认不需要
* @param int $second
url执行超时时间,默认30s
* @throws WxPayException
private function postXmlCurl($xml, $url, $useCert = false, $second = 30){
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);
//设置header
curl_setopt($ch, CURLOPT_HEADER, FALSE);
//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
if($useCert == true){
//设置证书
//使用证书:cert 与 key 分别属于两个.pem文件
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
//curl_setopt($ch,CURLOPT_SSLCERT, WxPayConfig::SSLCERT_PATH);
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
//curl_setopt($ch,CURLOPT_SSLKEY, WxPayConfig::SSLKEY_PATH);
//post提交方式
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
//运行curl
$data = curl_exec($ch);
//返回结果
if($data){
curl_close($ch);
$error = curl_errno($ch);
curl_close($ch);
* 错误代码
服务器输出的错误代码
* return string
public function error_code( $code ){
$errList = array(
'商户未开通此接口权限',
'NOTENOUGH'
'用户帐号余额不足',
'ORDERNOTEXIST'
'订单号不存在',
'ORDERPAID'
'商户订单已支付,无需重复操作',
'ORDERCLOSED'
'当前订单已关闭,无法支付',
'SYSTEMERROR'
'系统错误!系统超时',
'APPID_NOT_EXIST'
'参数中缺少APPID',
'MCHID_NOT_EXIST'
'参数中缺少MCHID',
'APPID_MCHID_NOT_MATCH' =&
'appid和mch_id不匹配',
'LACK_PARAMS'
'缺少必要的请求参数',
'OUT_TRADE_NO_USED'
'同一笔交易不能多次提交',
'SIGNERROR'
'参数签名结果不正确',
'XML_FORMAT_ERROR'
'XML格式错误',
'REQUIRE_POST_METHOD'
'未使用post传递参数 ',
'POST_DATA_EMPTY'
'post数据不能为空',
'NOT_UTF8'
'未使用指定编码格式',
if( array_key_exists( $code , $errList ) ){
return $errList[$code];
使用方法:
include 'wechatAppPay.class.php';
//1.统一下单方法
$wechatAppPay = new wechatAppPay($appid, $mch_id, $notify_url, $key);
$params['body'] = '商品描述';
//商品描述
$params['out_trade_no'] = 'O23-001';
//自定义的订单号
$params['total_fee'] = '100';
//订单金额 只能为整数 单位为分
$params['trade_type'] = 'APP';
//交易类型 JSAPI | NATIVE | APP | WAP
$result = $wechatAppPay-&unifiedOrder( $params );
print_r($result); // result中就是返回的各种信息信息,成功的情况下也包含很重要的prepay_id
//2.创建APP端预支付参数
/** @var TYPE_NAME $result */
$data = @$wechatAppPay-&getAppPayParams( $result['prepay_id'] );
// 根据上行取得的支付参数请求支付即可
print_r($data);
返回结果 字段名 变量名 必填 类型 示例值 描述 返回状态码 returncode 是 String(16) SUCCESS
SUCCESS/FAIL 此字段是通信标识,非交易标识,交易是否成功需要查看resultcode来判断 返回信息 returnmsg 否 String(128) 签名失败
返回信息,如非空,为错误原因 签名失败 参数格式校验错误 以下字段在returncode为SUCCESS的时候有返回
字段名 变量名 必填 类型 示例值 描述 应用APPID appid 是 String(32) wx8888 调用接口提交的应用ID 商户号 mchid 是 String(32)
调用接口提交的商户号 设备号 deviceinfo 否 String(32) 764 调用接口提交的终端设备号, 随机字符串 noncestr 是 String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 微信返回的随机字符串 签名 sign 是 String(32) C380BEC2BFD727A4BF3AD6 微信返回的签名,详见签名算法 业务结果 resultcode 是 String(16) SUCCESS SUCCESS/FAIL 错误代码 errcode 否 String(32) SYSTEMERROR 详细参见第6节错误列表 错误代码描述 errcodedes 否 String(128) 系统错误 错误返回的信息描述 以下字段在returncode 和result_code都为SUCCESS的时候有返回
字段名 变量名 必填 类型 示例值 描述 交易类型 tradetype 是 String(16) JSAPI 调用接口提交的交易类型,取值如下:JSAPI,NATIVE,APP,详细说明见参数规定 预支付交易会话标识 prepayid 是 String(64) wx 微信生成的预支付回话标识,用于后续接口调用中使用,该值有效期为2小时 举例如下:
分享本文至:
WRITTEN BY
极乐鸟博客http://jileniao.net
看了本文是不是觉得很赞,那就赶紧点击下面按钮分享给身边的朋友吧!
后面的回调接口呢?我的也是这样,不过回调接口没有值ThinkPHP整合微信支付之JSAPI模式 - ThinkPHP框架
目前微信是很火的,微信支付目前很少在网上能看到一系列详细的demo,因此,花一点时间来做一下关于微信支付系列教程,本次教程是JSAPI模式支付,其他的还会继续写下去首先,下载微信支付的demo,我们根据微信上的demo来整合到TP中。
介绍下我们这里需要用到的几个文件:
在demo文件夹中:
js_api_call.php:提供了微信jsapi的主要功能
log_.php:提供打印日志功能
notify_url.php:异步通知功能
notify_url.log:异步通知日志
qrcode.js:生成二维码js插件
接下来介绍下WxPayPubHelper文件夹下的文件:
cacert 文件夹是存放微信证书的(PS:具体我还没怎么用证书,虽然下载下来了,证书请在微信商户平台上下载)
SDKRuntimeException.php:这个就是处理异常的、
WxPay.pub.config.php:这个是做一些配置的,稍后会详细讲解
WxPayPubHelper.php:这个其实就是微信支付的工具类,对于初学者只要知道怎么用他里面的方法就够了
OK,了解了微信官方提供的文件,我们就可以开始整合到TP中了,废话不多说,这就开始!
step1:将demo中的WxPayPubHelper整个文件夹都复制到TP的Vendor目录下,像我这样:
step2:配置WxPay.pub.config.php文件:
这里的配置都有注释,如果还有不懂或者配置出现问题可以留言提问
同时我把微信的这个配置放到了TP的config中,这一步大家可以随意&?php
return&array(
&&&&//'配置项'=&'配置值'
&&&&define('WEB_HOST',&'这是您的网站域名地址'),
&&&&/*微信支付配置*/
&&&&'WxPayConf_pub'=&array(
&&&&&&&&'APPID'&=&&'您的APPID',
&&&&&&&&'MCHID'&=&&'您的商户ID',
&&&&&&&&'KEY'&=&&'商户秘钥',
&&&&&&&&'APPSECRET'&=&&'您的APPSECRET',
&&&&&&&&'JS_API_CALL_URL'&=&&WEB_HOST.'/index.php/Home/WxJsAPI/jsApiCall',
&&&&&&&&'SSLCERT_PATH'&=&&WEB_HOST.'/ThinkPHP/Library/Vendor/WxPayPubHelper/cacert/apiclient_cert.pem',
&&&&&&&&'SSLKEY_PATH'&=&&WEB_HOST.'/ThinkPHP/Library/Vendor/WxPayPubHelper/cacert/apiclient_key.pem',
&&&&&&&&'NOTIFY_URL'&=&&&WEB_HOST.'/index.php/Home/WxJsAPI/notify',
&&&&&&&&'CURL_TIMEOUT'&=&&30
);step3:将生成二维码的js放在Public目录下(这里目前用不到,在用扫码支付的情况才用到这个js),将日志文件放在Public目录下:像我这样:
step4:创建控制器:这里创建了一个WxJsAPIController的控制器,这里大家随便起名字,只要这个跟你们在公众平台上的设置相对应就可以(公众平台设置稍后介绍)
下面是控制器的代码部分了,首先初始化控制器,将WxPayPubHelper导入/**
&&&&&*&初始化
&&&&public&function&_initialize()
&&&&&&&&//引入WxPayPubHelper
&&&&&&&&vendor('WxPayPubHelper.WxPayPubHelper');
&&&&}接下来是使用统一支付接口,获取prepay_id的方法:&public&function&jsApiCall()
&&&&&&&&//使用jsapi接口
&&&&&&&&$jsApi&=&new&\JsApi_pub();
&&&&&&&&//=========步骤1:网页授权获取用户openid============
&&&&&&&&//通过code获得openid
&&&&&&&&if&(!isset($_GET['code']))
&&&&&&&&&&&&//触发微信返回code码
&&&&&&&&&&&&$url&=&$jsApi-&createOauthUrlForCode(C('WxPayConf_pub.JS_API_CALL_URL'));
&&&&&&&&&&&&Header(&Location:&$url&);
&&&&&&&&}else
&&&&&&&&&&&&//获取code码,以获取openid
&&&&&&&&&&&&$code&=&$_GET['code'];
&&&&&&&&&&&&$jsApi-&setCode($code);
&&&&&&&&&&&&$openid&=&$jsApi-&getOpenId();
&&&&&&&&//=========步骤2:使用统一支付接口,获取prepay_id============
&&&&&&&&//使用统一支付接口
&&&&&&&&$unifiedOrder&=&new&\UnifiedOrder_pub();
&&&&&&&&//设置统一支付接口参数
&&&&&&&&//设置必填参数
&&&&&&&&//appid已填,商户无需重复填写
&&&&&&&&//mch_id已填,商户无需重复填写
&&&&&&&&//noncestr已填,商户无需重复填写
&&&&&&&&//spbill_create_ip已填,商户无需重复填写
&&&&&&&&//sign已填,商户无需重复填写
&&&&&&&&$unifiedOrder-&setParameter(&openid&,$openid);//商品描述
&&&&&&&&$unifiedOrder-&setParameter(&body&,&贡献一分钱&);//商品描述
&&&&&&&&//自定义订单号,此处仅作举例
&&&&&&&&$timeStamp&=&time();
&&&&&&&&$out_trade_no&=&C('WxPayConf_pub.APPID').$timeS
&&&&&&&&$unifiedOrder-&setParameter(&out_trade_no&,$out_trade_no);//商户订单号
&&&&&&&&$unifiedOrder-&setParameter(&total_fee&,&1&);//总金额
&&&&&&&&$unifiedOrder-&setParameter(&notify_url&,C('WxPayConf_pub.NOTIFY_URL'));//通知地址
&&&&&&&&$unifiedOrder-&setParameter(&trade_type&,&JSAPI&);//交易类型
&&&&&&&&//非必填参数,商户可根据实际情况选填
&&&&&&&&//$unifiedOrder-&setParameter(&sub_mch_id&,&XXXX&);//子商户号
&&&&&&&&//$unifiedOrder-&setParameter(&device_info&,&XXXX&);//设备号
&&&&&&&&//$unifiedOrder-&setParameter(&attach&,&XXXX&);//附加数据
&&&&&&&&//$unifiedOrder-&setParameter(&time_start&,&XXXX&);//交易起始时间
&&&&&&&&//$unifiedOrder-&setParameter(&time_expire&,&XXXX&);//交易结束时间
&&&&&&&&//$unifiedOrder-&setParameter(&goods_tag&,&XXXX&);//商品标记
&&&&&&&&//$unifiedOrder-&setParameter(&openid&,&XXXX&);//用户标识
&&&&&&&&//$unifiedOrder-&setParameter(&product_id&,&XXXX&);//商品ID
&&&&&&&&$prepay_id&=&$unifiedOrder-&getPrepayId();
&&&&&&&&//=========步骤3:使用jsapi调起支付============
&&&&&&&&$jsApi-&setPrepayId($prepay_id);
&&&&&&&&$jsApiParameters&=&$jsApi-&getParameters();
&&&&&&&&$this-&assign('jsApiParameters',$jsApiParameters);
&&&&&&&&$this-&display('pay');
&&&&&&&&//echo&$jsApiP
&&&&}这里都是复制微信demo的,改改名字罢了,没什么其他的
接下来是异步通知方法,也是复制的微信demo上的&public&function&notify()
&&&&&&&&//使用通用通知接口
&&&&&&&&$notify&=&new&\Notify_pub();
&&&&&&&&//存储微信的回调
&&&&&&&&$xml&=&$GLOBALS['HTTP_RAW_POST_DATA'];
&&&&&&&&$notify-&saveData($xml);
&&&&&&&&//验证签名,并回应微信。
&&&&&&&&//对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
&&&&&&&&//微信会通过一定的策略(如30分钟共8次)定期重新发起通知,
&&&&&&&&//尽可能提高通知的成功率,但微信不保证通知最终能成功。
&&&&&&&&if($notify-&checkSign()&==&FALSE){
&&&&&&&&&&&&$notify-&setReturnParameter(&return_code&,&FAIL&);//返回状态码
&&&&&&&&&&&&$notify-&setReturnParameter(&return_msg&,&签名失败&);//返回信息
&&&&&&&&}else{
&&&&&&&&&&&&$notify-&setReturnParameter(&return_code&,&SUCCESS&);//设置返回码
&&&&&&&&$returnXml&=&$notify-&returnXml();
&&&&&&&&echo&$returnX
&&&&&&&&//==商户根据实际情况设置相应的处理流程,此处仅作举例=======
&&&&&&&&//以log文件形式记录回调信息
//&&&&&&&&&$log_&=&new&Log_();
&&&&&&&&$log_name=&__ROOT__.&/Public/notify_url.log&;//log文件路径
&&&&&&&&log_result($log_name,&【接收到的notify通知】:\n&.$xml.&\n&);
&&&&&&&&if($notify-&checkSign()&==&TRUE)
&&&&&&&&&&&&if&($notify-&data[&return_code&]&==&&FAIL&)&{
&&&&&&&&&&&&&&&&//此处应该更新一下订单状态,商户自行增删操作
&&&&&&&&&&&&&&&&log_result($log_name,&【通信出错】:\n&.$xml.&\n&);
&&&&&&&&&&&&}
&&&&&&&&&&&&elseif($notify-&data[&result_code&]&==&&FAIL&){
&&&&&&&&&&&&&&&&//此处应该更新一下订单状态,商户自行增删操作
&&&&&&&&&&&&&&&&log_result($log_name,&【业务出错】:\n&.$xml.&\n&);
&&&&&&&&&&&&}
&&&&&&&&&&&&else{
&&&&&&&&&&&&&&&&//此处应该更新一下订单状态,商户自行增删操作
&&&&&&&&&&&&&&&&log_result($log_name,&【支付成功】:\n&.$xml.&\n&);
&&&&&&&&&&&&}
&&&&&&&&&&&&//商户自行增加处理流程,
&&&&&&&&&&&&//例如:更新订单状态
&&&&&&&&&&&&//例如:数据库操作
&&&&&&&&&&&&//例如:推送支付完成信息
&&&&}这里我把记录日志的类写到了function.php中:function&&log_result($file,$word)
&&&&$fp&=&fopen($file,&a&);
&&&&flock($fp,&LOCK_EX)&;
&&&&fwrite($fp,&执行日期:&.strftime(&%Y-%m-%d-%H:%M:%S&,time()).&\n&.$word.&\n\n&);
&&&&flock($fp,&LOCK_UN);
&&&&fclose($fp);
}好了 其实控制器的方法就这么多,没什么其他的了,下面看一下页面,直接上代码吧:&!DOCTYPE&html&
&&&&&meta&http-equiv=&content-type&&content=&text/charset=utf-8&/&
&&&&&title&微信安全支付&/title&
&&&&&script&type=&text/javascript&&
&&&&&&&&//调用微信JS&api&支付
&&&&&&&&function&jsApiCall()
&&&&&&&&&&&&WeixinJSBridge.invoke(
&&&&&&&&&&&&&&&&'getBrandWCPayRequest',
&&&&&&&&&&&&&&&&&?php&echo&$jsApiP&?&,
&&&&&&&&&&&&&&&&function(res){
&&&&&&&&&&&&&&&&&&&&WeixinJSBridge.log(res.err_msg);
&&&&&&&&&&&&&&&&&&&&alert(res.err_code+res.err_desc+res.err_msg);
&&&&&&&&&&&&&&&&&&&&//alert(&{$jsApiParameters}&);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&);
&&&&&&&&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();
&&&&&&&&&&&&}
&&&&&/script&
&&&&&/br&&/br&&/br&&/br&
&&&&&div&align=&center&&
&&&&&&&&&button&style=&width:210&height:30&background-color:#FE6714;&border:0px&#FE6714&&cursor:&&&color:&&font-size:16&&type=&button&&onclick=&callpay()&&&贡献一下&/button&
&&&&&/div&
&/html&无须改动什么,直接复制就好
接下来是微信公众平台上的配置了,这里我遇到过问题,如果有在这里遇到问题的同学请留言,比如出现了access_deined或者access_notallowed等问题,这都可能是因为这里配置不对。
请看配置过程截图:
点击修改进入配置:
好了,可以测试了:下面是我的测试截图:
用微信扫描二维码
微信上点击贡献一下出现支付页面:
到此为止,微信JSAPI支付功能就全部做好了
当然,如果你是第一次做,肯定会遇到各种问题,
如果你是新手,遇到的问题都不知道为什么,
及时你做过了再做我相信还是可能由于细节上的疏忽会出现问题
不过不要烦躁,耐心的去发现问题
有问题请留言,下面还会介绍微信扫码支付模式一,模式二的详细教程
微信支付教程扫码模式一:
微信支付教程扫码模式二:
微信支付教程刷卡支付:
欢迎大家吐槽,转载请说明出处,请支持原创,谢谢!
我们的微信开发群:一群:
代码已放在群文件中
欢迎大家加入讨论问题
积分:1701
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

我要回帖

更多关于 java实现微信支付 的文章

 

随机推荐