小弟是第一次写博客,写的不好多有见谅。最近有一个项目要跟微信做支付对接,之前已经听说微信支付是个大坑,好吧,确实是大坑!这次项目公众号支付和APP支付都有涉及,下面分别介绍。

首先,得从从微信官方下载SDK,我这里的开发语言是用PHP。官方下载地址:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=11_1

公众号支付

关于公众号支付,官方给出的demo其实已经很全了,按步骤走就可以,下面基于thinkphp来介绍一下步骤和注意点。

1.配置授权目录

假设项目要调用支付的访问地址是:http://yourdomain.com/weixin.php/Order/wechatPay 这个地址是thinkphp的访问路径,意思是Order控制器下wechatPay方法。那么在微信后台配置的授权目录就是http://yourdomain.com/weixin.php/Order,然后添加测试人员的微信白名单。OK

2.配置微信公众号信息和微信商户信息

本人在model层引入微信SDK,怎么引入自己斟酌了。要配置好几个文件的路径(有好几个require_once)。正确引入微信的sdk包之后,修改配置文件的APPID,MCHID,KEY,APPSECRET,商户证书路径等。MCHID,KEY要到商户平台去找,并且到商户平台下载两个证书,替换掉原demo的证书,注意路径不能错。(其实证书在支付端貌似还没用到,先配置好)。

3.参考jsapi.php,设置好参数。

//①、获取用户openid

$tools = new JsApiPay();
        $openId = $tools->GetOpenid();
        //②、统一下单
        $input = new WxPayUnifiedOrder();
        $input->SetBody("test");
        $input->SetAttach("test");
        $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));
        $input->SetTotal_fee("1");
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 600));
        $input->SetGoods_tag("test");
        $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");
        $input->SetTrade_type("JSAPI");
        $input->SetOpenid($openId);
        $order = WxPayApi::unifiedOrder($input);
        //获取订单信息
        $jsApiParameters = $tools->GetJsApiParameters($order);
        //获取共享收货地址js函数参数
        $editAddress = $tools->GetEditAddressParameters();

具体参数可以参考官方说明,步骤是先获取用户的openId,调用统一下单Api生成预付单WxPayApi::unifiedOrder($input);,一定要获取到prepay_id!再组装成JS供前台html调用:GetJsApiParameters。前台JS可以参考demo,起初以为要用到微信的JS-SDK,这里是不需要的。

PS:最近微信推出了一个web调试工具,做支付是用不了那玩意,会提示没有SDK,小弟在这里吃了亏,测试还是老老实实拿手机吧。

到这里基本就可以调通了,还有个notify_url的回调,也可以参考官方demo。

移动支付

移动APP支付相比公众号支付坑要多,服务器端代码官方也是没有给出具体的demo(至少我没找到),但是思路基本跟公众号一样,配置好参数,生成预付单,根据预付单调起支付页面。下面具体说说。

这里有个地方要注意一下!移动支付是只能到微信开发平台注册获取AppId、APPSECRET,然后创建移动应用,配置好应用签名,包名等信息。客户端具体配置可以参考:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_5,就是说要在APP注册APPID。另外,商户平台跟上面公众号的说的商户平台不能是同一个,也就是说公众号跟APP各有一个商户平台,这也是非常值得吐槽的地方。

配置好开放平台的信息跟商户平台后,就可以开始撸代码了。

1,APP支付的PHP代码还是参考jsapi.php,略有修改。

配置APPID,证书等信息可以参考公众平台,不过都要换成开放平台的APPID等,这里不再累赘说明。

2参考以下代码:

$input = new WxPayUnifiedOrder();
        $input->SetBody("test");
        $input->SetAttach("test");
        $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));
        $input->SetTotal_fee("1");
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 600));
        $input->SetGoods_tag("test");
        $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");
        $input->SetTrade_type("APP");
        $preorder = WxPayApi::unifiedOrder($input);
        //重新生成签名
        $jsApiParameters = $tools->GetAppApiParameters($preorder);

要注意的地方是$input->SetTrade_type("APP") ,trade_type要改成APP ,调用统一下单接口后生成预付单$preorder(要有prepay_id),后面重新生成签名这里要稍作修改。GetAppApiParameters方法的代码直接奉上

public function GetAppApiParameters($UnifiedOrderResult)

{
        if(!array_key_exists("appid", $UnifiedOrderResult)
            || !array_key_exists("prepay_id", $UnifiedOrderResult)
            || $UnifiedOrderResult['prepay_id'] == "")
        {
            throw new WxPayException("参数错误");
        }
        $jsapi = new WxPayJsApiPay();
        $jsapi->SetAppid($UnifiedOrderResult["appid"]);
        $jsapi->SetPartnerId($UnifiedOrderResult["mch_id"]);
        $time =time();
        $timeStamp = "$time";
        $jsapi->SetTimeStamp("$timeStamp");
        $jsapi->SetNonceStr(WxPayApi::getNonceStr());
        $jsapi->SetPackage("Sign=WXPay");
        $jsapi->SetPrepayId($UnifiedOrderResult["prepay_id"]);
        $jsapi->SetPaySign($jsapi->MakeSign());
        $parameters = json_encode($jsapi->GetValues());
        return $parameters;
    }

微信的官方说明是这样的:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay

行,没问题,按你微信说的办,上面方法就用这几个参数重新生成签名(也可以在客户端生成sign,这里在服务器端生成),所以新增了几个参数(有的参数可以在客户端直接写死)。有个注意的地方就是签名的字段要改成小写,比如appId要改成appid,prepayId改成prepayid。所以上面的set方法要改了(够坑的。。。)

例如SetAppidset方法改成这样(同样把get方法也修改吧,保持严谨性),其他参数一个个修改。(反正我改成小写就OK了)

public function SetAppid($value)
    {
        $this->values['appid'] = $value;//把key值改成小写
    }

根据上面方法生成sign签名后,返回预付单json给客户端,搞定。

notify通知处理可以参照公众号demo,具体业务自己再写吧。

总结:公众号支付和APP支付原理差不多,首先都要绑定授权地址或授权APP,调用统一下单API生成预付单,再传到前台调用微信支付。上面只列举了一小部分支付功能,其他支付功能可以参考官方文档,配置的东西太多,官方说明太简单。

微信公众号支付和移动支付相关推荐

  1. vue 在微信公众号里使用支付宝支付(h5支付宝支付)

    vue 在微信公众号里使用支付宝支付(h5支付宝支付) 需求:在微信公众号里面支持支付宝支付. 思路:微信是不能直接调用支付宝的,所以我们需要使用一个中间页提示用户在浏览器中打开,然后进行支付宝网页或 ...

  2. 微信公众号中的支付宝支付与微信支付 支付宝支付问题(微信bug)

    一般,在微信公众号中的商城都是需要支持微信支付和支付宝支付的,当然,较大的公司对于鹅厂和阿里的站队就不说了,所以这里简单记录一下支付宝支付和微信支付的主要流程.说是简单介绍,这是因为确实不难,因为前端 ...

  3. 微信公众号之刷卡支付

    此篇文章具体来聊聊微信刷卡支付 刷卡支付-官方文档 场景介绍 步骤1:用户选择刷卡支付付款并打开微信,进入"我"->"钱包"->"刷卡&q ...

  4. 微信公众号,关联网页支付功能(公众号支付)的实现

    公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付.应用场景有: 1. 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付 ...

  5. 支付宝支付功能实现原理,微信公众号中实现支付宝支付功能开发流程

    这篇文章使用一些简单的代码例子来解释微信接入支付宝支付功能的操作步骤,即使新手也可以轻松参透的. 第三方支付是指具备一定实力和信誉保障的独立机构,采用与各大银行签约的方式,通过与银行支付结算系统接口对 ...

  6. 微信公众号h5使用jsapi支付

    准备工作 准备好公众号及支付商户号相关的:appid,商户号id,appsecret,apikey(支付密钥v2),下载好api支付证书路径,公众号中配置好业务域名(前端与域名). 域名穿透内网 我使 ...

  7. 微信公众号 H5 通联支付

    参考:https://blog.csdn.net/caimingxian401/article/details/96993205 注意:必须使用 " setTimeout " 箭头 ...

  8. vue 调用共众url_vue单页面,在微信公众号支付中遇到的URL未注册BUG解决方法-Go语言中文社区...

    今天在做微信公众号支付的时候,遇到一个bug,在当前支付页面点击支付,就会报错,提示当前页面的URL未注册.如下图: 但是,这个URL我们是在后台微信公众号配置了的,所以说不会出错. 但是我们刷新一次 ...

  9. 微信公众号支付WeixinJSBridge

    微信公众号中直接发起支付 此前开发更具官方文档一直在使用,wx.chooseWXPay方法完成支付,WeixinJSBridge最开始开发微信的时候也有使用,但是经常出问题,支付不能发起,当时查找好的 ...

  10. 微信公众号支付缺少参数问题

    最近在做微信公众号支付的内容.调用微信公众号给出的支付方法 发现总是报这样一个错误:调用微信支付JSAPI 缺少参数 appId.检查了很久,还是没发现问题在哪里.于是只好采用微信支付的另一种方法: ...

最新文章

  1. sublime配置python3环境_【env】Sublime配置Python3开发环境
  2. 多个会话对表加表级读锁和表级写锁后的操作权限分析(表级读锁+表级写锁)
  3. 软件测试管理的几个基本要素
  4. C#订阅与发布标准实现
  5. C++ vector 内存分配与回收机制
  6. web服务器通信原理
  7. python可以跨平台吗_python是跨平台的么
  8. 自动收发短信验证码机器人_除了验证码:禁止机器人!
  9. http下载异常_用了这么久HTTP, 你是否了解Content-Length?
  10. 老王的JAVA基础课:第3课 IDEA的安装和使用
  11. sko.GA实现遗传算法的源码解析
  12. Building Worlds In Unreal 学习笔记——07-11 岩石树落木灌木绘制/溪水着色器/潮湿与焦散贴花/后处理
  13. 电影排行榜(requests + bs4 scrapy)
  14. KendoUI模板引擎 - 结合组件使用
  15. 计算机房灭火器如何配置,机房灭火器配置标准
  16. 微信小程序图片等比缩放显示正中间
  17. 软件测试常用文档规范
  18. Ubuntu 20.04 LTS 关闭 Swap 分区
  19. 那些曾虐我千百遍的计算机组成原理
  20. PART 2.2 风控建模前数据预处理清洗

热门文章

  1. 耳机——AKG K450 及 Beats Solo2 对比
  2. mysql数据库安全加固_数据库安全加固系统
  3. 为什么创业?创业能给你带来什么?
  4. 荣耀30s怎么升级鸿蒙,惊喜!4部荣耀手机可升级至华为鸿蒙系统,网友表示:终于等到了...
  5. 情商为什么比智商更重要1
  6. 天天背单词--的设计与实现(一)
  7. 上海汇珏EPON典型应用分析
  8. liunx篇---测试过程中什么时候会用到liunx。常用的命令有哪些?
  9. Novavax向美国提交新冠疫苗紧急使用授权申请;西门子医疗发布最新业绩 | 医药健闻...
  10. 机器学习研究项目--以机器视觉工程师的视角(MLP篇)