搜索
首页微信小程序微信开发微信开发之微信支付
微信开发之微信支付May 27, 2017 pm 01:31 PM
微信开发支付

一、 微信后台设置

1.添加测试授权目录和测试白名单:

在微信后台,设置测试授权目录,如xxx.sinaapp.com/example/,测试白名单中添加你的微信号。
注意,这里的“个人微信号”既不是qq号也不是个人昵称。而是登录微信后在“我”界面中的“微信号”字段的字符串。
支付授权目录设不设无所谓,因为我们只是测试。

2.列表内容

设置网页授权域名:
在“开发者中心/接口权限表/网页账号/网页授权获取用户基本信息”中进行设置。网页授权域名设置为测试服务器的域名,如:xxx.sinaapp.com,不需要http://。

二、商户平台设置

1.下载证书

在“账户设置/API安全/API证书”中下载。需要用到管理员的手机验证码。下载后的进行解压缩,我们需要用到的是apiclient_key.pem和apiclient_cert.pem。

2.生成支付key

在“账户设置/API安全/API密钥”中进行设置。支付key将在支付时用到,这个值就是源代码配置文件中的KEY常量。

三、使用官方V3.7的示例代码

1、在Wxpay.pub.config.php修改配置,主要是:

    const APPID                 //公众号中“开发者中心”看到的AppID
    const MCHID                     //微信支付商户资料审核成功邮件中的商户号
    const KEY                   //你在商户平台中设置的支付key
    const APPSECRET             //公众号中“开发者中心”看到的AppSecret

    const JS_API_CALL_URL       //设置这个url,可在此页面中获得用户的openid。

    //证书路径,注意应该填写绝对路径
    const SSLCERT_PATH          // apiclient_cert.pem文件url
    const SSLKEY_PATH               // apiclient_key.pem文件url,如’/cert/ apiclient_key.pem’
    const NOTIFY_URL                //异步通知url,可使用demo中的notify_url.php

 

2、修改官方代码中的bug:
如果出现“curl_setopt() expects parameter 2 to be long”错误,是因为WxPayPubHelper.php中有几个地方将“curl_setopt”拼错了,拼成“curl_setop”,将其修改后即可。如果出现“curl_close(): 11 is not a valid”,则是因为错误地关闭了一个已经关闭的curl session,可以将curl_close()代码加上如下判断:

if(gettype($ch) == 'resource') curl_close($ch);

3、官方demo直接跑不通,我们需要自己搞定它。首先中index.php中增加一个链接:

<a href="pay.php"> 获取openid</a></h4>

3、 然后写一个pay.php页面,用于获取用户openid并发起支付:

<?php
/**
 * JS_API支付demo
 * ====================================================
 * 在微信浏览器里面打开H5网页中执行JS调起支付。接口输入输出数据格式为JSON。
 * 成功调起支付需要三个步骤:
 * 步骤1:网页授权获取用户openid
 * 步骤2:使用统一支付接口,获取prepay_id
 * 步骤3:使用jsapi调起支付
 */
include_once ("WxPayPubHelper.php");

$jsApi = new JsApi_pub();
// =========步骤1:网页授权获取用户openid============
// 通过code获得openid
if (! isset($_GET[&#39;code&#39;])) {
 // 触发微信返回code码
 $url = $jsApi->createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL);
 Header("Location: $url");
} else {
 // 获取code码,以获取openid
 $code = $_GET[&#39;code&#39;];
 $jsApi->setCode($code);
 $openid = $jsApi->getOpenId();
}

$goods = "test";
// 使用统一支付接口
$unifiedOrder = new UnifiedOrder_pub();
$unifiedOrder->setParameter("openid", "$openid"); // 用户openid
$unifiedOrder->setParameter("body", "$goods"); // 商品描述
 // 自定义订单号,此处仅作举例
$timeStamp = time();
$out_trade_no = WxPayConf_pub::APPID . "$timeStamp"; // 商户订单号
$unifiedOrder->setParameter("out_trade_no", "$out_trade_no");
$price = "1";
$unifiedOrder->setParameter("total_fee", "$price"); // 总金额
$unifiedOrder->setParameter("notify_url", WxPayConf_pub::NOTIFY_URL); // 通知地址
$unifiedOrder->setParameter("trade_type", "JSAPI"); // 交易类型

$prepay_id = $unifiedOrder->getPrepayId();
// =========步骤3:使用jsapi调起支付============
$jsApi->setPrepayId($prepay_id);

$jsApiParameters = $jsApi->getParameters();
echo $jsApiParameters;

?>

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<title>微信安全支付</title>

<script type="text/javascript">

 //调用微信JS api 支付
 function jsApiCall()
 {
 WeixinJSBridge.invoke(
 &#39;getBrandWCPayRequest&#39;,
 <?php echo $jsApiParameters; ?>,
 function(res){
 WeixinJSBridge.log(res.err_msg);
 //alert(res.err_code+res.err_desc+res.err_msg);
 }
 );
 }

 function callpay()
 {
 if (typeof WeixinJSBridge == "undefined"){
 if( document.addEventListener ){
 document.addEventListener(&#39;WeixinJSBridgeReady&#39;, jsApiCall, false);
 }else if (document.attachEvent){
 document.attachEvent(&#39;WeixinJSBridgeReady&#39;, jsApiCall); 
 document.attachEvent(&#39;onWeixinJSBridgeReady&#39;, jsApiCall);
 }
 }else{
 jsApiCall();
 }
 }
 </script>
</head>
<body>
    <p> </p>
    <p> </p>
    <p align="center">
        <table border="1">
            <tr>
                <td>openID</td>
                <td><?php echo $openid;?></td>
            </tr>
            <tr>
                <td>商品名称</td>
                <td><?php echo $goods;?></td>
            </tr>
            <tr>
                <td>订单号</td>
                <td><?php echo $out_trade_no;?></td>
            </tr>
            <tr>
                <td>prepay_id</td>
                <td><?php echo $prepay_id;?></td>
            </tr>
            <tr>
                <td>价格</td>
                <td><?php echo $price;?></td>
            </tr>
        </table>
        <button data-theme="b" type="button" onclick="callpay()">贡献一下</button>
    </p>
</body>
</html>

四、使用官方V3的示例代码

1、下载官方示例代码
最新SDK版本为V3.7,但我们不要去下V3.7的demo(那个例子跑不通),而是要去下V3的例子:

pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

2、将demo解压缩放到你的web根目录下。比如,压缩包解开后的目录是WxpayAPI_php_v3,你要进入这个目录后将所有文件选中,然后复制到你的项目目录中去。在这个目录中有一个index.php,那么到测试时候需要访问 xxx.sinaapp.com/index.php。

3、将index.php中的标签的url地址改为你服务器上的url地址。

4、在你的微信中,随便打开一个对话窗口,输入index.php地址,如xxx.sinaapp.com/index.php,然后在对话窗口中点击这个链接。会出现几个按钮,点“JSAPI支付”的按钮,即可弹出支付金额为1分钱的窗口,输入收货人,支付。即会弹出支付成功界面。
到这一步,说明官方的支付代码是基本可用的,接下来,我们可以在它的基础上修改成自己的代码。

5、替换cert目录下的apiclient_key.pem和apiclient_cert.pem成你自己的证书。

6、修改WxPay.Config.php中的以下几项成你自己的:

const APPID                 //公众号中“开发者中心”看到的AppID
const MCHID                     //微信支付商户资料审核成功邮件中的商户号
const KEY                   //你在商户平台中设置的支付key
const APPSECRET             //公众号中“开发者中心”看到的AppSecret

7、因为我们使用了sina的sae作为测试服务器,sae不允许直接写文件io,因此可以将官网代码中的文件操作进行相应的修改(使用SaeStorage)。也就是需要修改log.php中的CLogFileHandler类:

class CLogFileHandler implements ILogHandler
{
    private $fn=null;
    private $ss=null;
    public function construct($file = &#39;&#39;)
 {
        $this->fn=str_replace("../logs/", "", $file);
        $this->ss=new SaeStorage();
    }
    public function write($msg)
 {
        $bytes = $this->ss->read(&#39;log&#39;, $this->fn);
        $str = $bytes;
        $this->ss->write(&#39;log&#39;, $this->fn, "$str\n$msg");
    }
    public function destruct()
 {
        $fn=null;
        $ss=null;
    }
}

8、如果出现签名失败的错误,我们可以使用微信的支付接口调试工具来进行测试:pay.weixin.qq.com/wiki/tools/signverify/。
这个工具是虽然是用于验证“被扫支付”的,但通过它的“增加参数”按钮和“删除参数”按钮,我们也可以用它来测试“公众号支付”。例如,如果你提交的xml内容如下(可利用Log函数保存提交的xml内容到sae storage,然后下载日志文件):

<xml><openid><![CDATA[om8888LTHBj99992Qgl_eUAOFgxs]]></openid><body><![CDATA[test]]></body><out_trade_no><![CDATA[wx111196222243ffa1143858aaaa]]></out_trade_no><total_fee>1</total_fee><notify_url><![CDATA[http://xxx.sinaapp.com/wxpay/demo/notify_url.php]]></notify_url><trade_type><![CDATA[JSAPI]]></trade_type><appid><![CDATA[wx000096104a431111]]></appid><mch_id>6666833333</mch_id><spbill_create_ip><![CDATA[10.211.76.107]]></spbill_create_ip><nonce_str><![CDATA[1agieoxyi8hc7e817rsnjlyn9lxmsnxj]]></nonce_str><sign><![CDATA[817034E4DE8E6067EB85CDF7318EF0A1]]></sign></xml>

则你可以中测试工具中这样填写表单:
这里写图片描述
点击“生成签名”。将得到的签名和日志文件中的签名进行比较,看是否一致,即可排除签名算法的问题。
如果2个签名一致,则可以肯定是支付key的问题。要么是产品MM搞错了,要么是AppSecret和支付key搞反了(有一次产品MM告诉了为一个错误的支付key,浪费了我3天的时间!我反复确认了每一处代码、每一次后台参数设置之后,最终用“支付接口调试工具”确认签名无误,问题就出在支付key上。于是登入商户平台,因为不是管理员,又跟产品MM要了手机验证码,重新设置了支付key,代码一下就通了)

【相关推荐】

1. 微信公众号平台源码下载

2. 分享微信公众号开发刷卡支付的实例教程

3. 详解微信支付开发之刷卡支付实例

4. 详解微信小程序支付功能开发错误总结

以上是微信开发之微信支付的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
百度地图打车如何支付   打车的付款步骤介绍百度地图打车如何支付 打车的付款步骤介绍Mar 13, 2024 am 10:04 AM

  百度地图APP现在已经都成为了超多用户们首选的出行导航的软件,那么这里的一些功能全面,都能够免费的让大家进行选择操作哦,解决自己日常出行方面会遇到的一些问题,完全都能够查询到自己的一些出行的路线,规划自己的一些出行的方案,查询完对应的这一些路线,都能根据自己的需求,选择合适的一些出行方式,那么你们不管是选择一些公共交通,骑行,步行或者是打车等,都能满足你们的,有着对应的一些导航路线,成功的带领你们去往某地,那么大家选择打车的话,都能感到更加的方便,超多的一些司机们都是会在线接单,打车变得超级

uniapp应用如何实现支付和订单管理uniapp应用如何实现支付和订单管理Oct 19, 2023 am 10:37 AM

uniapp是一个跨平台的应用开发框架,可以同时开发小程序、App和H5。在uniapp应用中,实现支付和订单管理是非常常见的需求。本文将介绍如何在uniapp应用中实现支付功能和订单管理,并给出具体的代码示例。一、实现支付功能支付功能是实现在线交易的关键,通常需要集成第三方支付平台的SDK。以下是uniapp中实现支付功能的具体步骤:注册并获取第三方支付平

使用PHP和PayPal API进行支付使用PHP和PayPal API进行支付Jun 19, 2023 pm 04:13 PM

随着网络交易的日益普及,支付方式也在逐渐多样化,其中PayPal作为一种广泛使用的支付方法备受欢迎。如果您想在您的网站或应用程序上使用PayPal来处理交易,那么您可以使用PHP和PayPalAPI来轻松地完成支付过程。PayPalAPI是一组编程接口,用于与PayPal进行交互。通过API,您可以接收来自PayPal的通知、查询最新的交易信息、发起付款

paynow支付是什么意思paynow支付是什么意思Sep 30, 2022 am 11:01 AM

PayNow支付是一种电子转账类服务,用户能够通过收款方指定的手机号码、身份证/FIN号、UEN号或PayNow二维码,直接向该收款方发起实时新币转账,而无须对方银行账号信息。

武汉坐公交车用什么支付武汉坐公交车用什么支付Oct 13, 2022 pm 02:17 PM

武汉坐公交车的支付方式:1、现金支付,需要提前准备好足额的零钱,直接把钱投入投币口即可;2、武汉通刷卡,武汉通全称武汉城市一卡通,是一种集成电路卡,也称为芯片卡;3、支付宝电子公交卡,在支付宝内先领取一张武汉电子公交卡,然后上车时直接扫描二维码扣款上车即可;4、微信乘车码支付,打开微信“乘车码”小程序,开通武汉“乘车码”就可以直接扫描二维码扣款上车。

美团外卖极速支付怎么关闭美团外卖极速支付怎么关闭Mar 27, 2024 am 10:41 AM

在快节奏的现代生活中,美团外卖以其便捷的服务和丰富的选择,深受广大消费者的喜爱。其中,极速支付功能更是为用户带来了极大的便利,一键即可完成支付,省去了繁琐的输入步骤。不过很多用户并不喜欢不经确认直接付款,所以想要关闭这一功能。那么究竟该如何关闭美团外卖的极速支付呢?在下文中本站小编就将为大家带来详细的步骤设置教程,希望能帮助到大家!1.在手机桌面点击“美团外卖”快捷方式图标。2.登录手机美团外卖app,点击右下角“我的”。3.在我的界面,点击“进入钱包”。4.在美团钱包界面,点击右上角“设置”图

美团立减金在哪开启支付时默认抵扣_美团立减金开启支付时默认抵扣教程美团立减金在哪开启支付时默认抵扣_美团立减金开启支付时默认抵扣教程Mar 28, 2024 am 11:00 AM

1、首先打开【美团】APP,在底部导航栏内,点击【我的】按钮。2、接着点击【我的钱包】功能按钮,点击【现金券】按钮。3、随后在顶部功能栏内,点【立减金】按钮,点击开启【支付时默认抵扣】的开关按钮,即可开启成功。

建立MySQL中买菜系统的订单支付表建立MySQL中买菜系统的订单支付表Nov 01, 2023 pm 03:48 PM

建立MySQL中买菜系统的订单支付表,需要具体代码示例随着互联网的发展,购物已经变得越来越方便。在购物的过程中,订单支付是购物过程中的重要环节。买菜系统不仅需要有订单生成功能,还必须拥有完整的支付流程,因为支付成功才能算是完成一单交易。本文将讲述如何建立MySQL中买菜系统的订单支付表,并提供具体的代码示例。一、订单支付表设计买菜系统中订单支付表存储的是订单

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具