精华内容
下载资源
问答
  • Jinja24Doc是用于带有jinja2模板的python模块的轻量级文档生成器。 它是Http不良组工具(WSGI连接器,WSGI / HTTP Server和mod_python连接器)的一部分。 它可以加载模块并获取其项目的文档。 无需配置,仅jinja2...
  • front-end-Doc 前端文档汇总(含代码规范、开发流程、知识分享,持续更新) 综合类 地址 前端文档基本例子 https://github.com/mgbq/front-end-Doc/blob/master/base.md 前端知识体系 ...Understanding ...
  • 本文内容如何维护一个golang 在线的doc 服务。 1 什么是godoc ? godoc golang 官方提供的文档生成工具, 2 为什么要有godoc ? 我们经常遇到一个问题,就是代码和文档不一致,线上代码版本总和wiki 给的不一样...

    本文内容是如何维护一个golang 在线的doc 服务。

    1 什么是godoc ?

    godoc 是 golang 官方提供的文档生成工具,

    2 为什么要有godoc ?

    我们经常遇到一个问题,就是代码和文档不一致,线上代码版本总和wiki 给的不一样,让人吐槽。为了解决这个痛点问题,golang 给出了个官方方案,也就是,文档应该与代码一起,当更新代码的时候,文档也能够同步得到更新。对于程序员来说,代码发布后,我们文档自动同步更新,这样非常完美。这就是为什么要有 godoc。

    3 怎么写godoc ?

    godoc 支持 package、const、var和 func 这些类型根据注释生成文档,而且只会对公有变量(首字母大写)生成。我们可以直接通过doc 查具体函数签名,函数使用说明,还有example 示例代码。

    3.1 package, type, const, func

    type, const, func以名称为注释的开头, package以Package name为注释的开头, 其中有效的关键字注释不应该超过3行。

    // Package AAA ...
    package AAA
    
    // Xyz ...
    const Xyz = 1
    
    // Abc ...
    type Abc struct {}
    
    // Bcd ...
    func Bcd() {}
    

    3.2 Bug

    以BUG(who)开头的注释, 将被识别为已知bug, 显示在bugs区域

    // BUG(who): 我是bug说明
    
    // Package AAA ...
    package AAA
    

    3.3 Deprecated

    函数签名前加// Deprecated: xxx ,使用时,ide 一般会自动提醒。不会加到doc 中

    3.4 example

    test 有两种,一种是单测,一种是example, 也就是示例代码。example 的代码和注释 使用godoc 会自动加到doc 中去。example 的示例如下:

    // 文件必须放在 AAA包目录下, 名字必须为example_xxx_test.go
    
    // Package AAA_test 为AAA example 示例
    package banana_test
    
    // 不加函数名,是包级别示例,放最上面
    func Example() {
        fmt.Println("Hello World")
        
        // Output:
        // Hello World
    }
    
    // 函数A将被展示在Function区域
    func ExampleA() {
        fmt.Println("Hello A")
        
        // Output:
        // Hello A
    }
    

    4 如果搭建自己的doc 服务

    4.1 使用 godoc

    godoc 本身能够 提供一个简单的httpserver 展示doc

    godoc -http=:6060
    

    使用效果如图:

    通过 godoc 可以查看本机GOPATH 下所有pkg 的文档,因为是本地,反应速度很快。如果公司需要维护一个doc 服务,可以考虑定时同步或者gitlib添加钩子,将代码库代码代码到一台机器上去,在这个机器上起godoc 服务。

    4.2 使用官方的 godoc.org 源码

    官方有个网站,提供在线doc 查询:https://godoc.org/ 。这个网站比较好用,可以查询github 和公有库代码的doc,代码开源。 使用方式如下:

    1,install redis
    
    2,install  Cloud SDK at https://cloud.google.com/sdk/docs/ ,为了search 的时候走代理
    
    3,clone 
    ```
    git clone https://go.googlesource.com/gddo $GOPATH/src/github.com/golang/gddo
    ```
    
    4,Run the server:
    ```
    cd $GOPATH/src/github.com/golang/gddo/gddo-server && \
       go build && \
       GITHUB_TOKEN=xyzzy123 ./gddo-server
    ```
    
    5,  http://127.0.0.1:8080 
    

    公司自己维护自己的gitlab的话,本身也可以支持,当搜索pkg ,会去clone 到临时文件夹,然后生成doc 数据放redis 中,反应速度还是挺快的。值得注意的是,这个库本身会每天定时去源站同步代码,所有不需要像第一种一样,得异步回调或者定时同步。

    最后

    本文总结了使用golang 写文档的标准做法,然后给出了两种维护doc 服务的方式。

    展开全文
  • 微信支付SDK,下载地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_13.登录微信支付平台https://pay.weixin.qq.com/index.php/account/api_cert下载支付证书方法步骤:1.demo文件处理(1)将官方...

    4f459e48311024fd45e0aa86d10d00a5.png

    前期准备:

    1.微信认证服务号,并且开通了微信支付

    2.微信支付SDK,下载地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

    3.登录微信支付平台https://pay.weixin.qq.com/index.php/account/api_cert下载支付证书

    方法步骤:

    1.demo文件处理

    (1)将官方的demo下载下来,文件名为WxpayAPI_php_v3,把这文件重命名为wxpay,为了后边书写目录方便;

    (2)打开lib文件夹下的WxPay.Api.php文件,在537行有一段curl网络请求配置代码:curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);

    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验

    替换成:curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);

    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验

    为了禁止 cURL 验证对等证书(peer's certificate)。

    (3)打开lib文件夹下的WxPay.Config.php文件,第25行开始,根据自己的账号完成基本信息设置;const APPID = '公众账号APPID';

    const MCHID = '商户号';

    const KEY = '商户支付密钥';

    const APPSECRET = '公众帐号secert';

    (4)打开lib文件夹下的WxPay.Notify.php文件,第79行的代码:if($needSign == true &&

    $this->GetReturn_code($return_code) == "SUCCESS")

    {

    $this->SetSign();

    }

    改成:if($needSign == true &&

    $this->GetReturn_code() == "SUCCESS")

    {

    $this->SetSign();

    }

    (5)打开cert证书目录,将里边的两个证书换成自己的支付证书。

    相关推荐:《PHP教程》

    2.公众号后台设置

    (1)配置网页授权域名,我的域名是(xy.chuyin.ren);

    5ba68a992e92d7c9e796bc1b4b0c2051.png

    (2)配置支付授权目录,域名是(xy.chuyin.ren),我将demo放到此域名指向的目录的weixinopen/文件夹下,demo中jsapi.php文件位于example/目录下,所以支付授权目录为:xy.chuyin.ren/weixinopen/wxpay/example/

    9409e59313f01bc2c6bc00813e6fb41f.png

    3.支付流程

    打开example目录下的jsapi.php文件,支付发起和处理,都是在这里完成。

    (1)获取用户openid

    之前配置好了自己的APPID和APPSecert,所以这里不用处理。//①、获取用户openid

    $tools = new JsApiPay();

    $openId = $tools->GetOpenid();

    这里首先初始化的一个JsApiPay()类得到一个对象,文件对应example/目录下的WxPay.JsApiPay.php,调用GetOpenid()方法,会自动获取自己的openID。

    (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("JSAPI");

    $input->SetOpenid($openId);

    $order = WxPayApi::unifiedOrder($input);

    echo '统一下单支付单信息
    ';

    printf_info($order);

    $jsApiParameters = $tools->GetJsApiParameters($order);

    对应WxPay.Api.php的第24行的unifiedOrder()方法,配置订单信息和支付回调函数,这里需要修改几个参数:

    A. 商品名称:$input->SetBody("test");

    B. 订单号$input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));

    C. 支付金额$input->SetTotal_fee("1");

    D. 支付验证链接

    设置为你的notify.php文件所在的位置,所以我这里设置为:http://xy.chuyin.ren/weixinopen/wxpay/example/notify.php

    也可以写其他地址,当然要在支付授权域名之下,支付成功之后就会自动回调到该链接指定的方法里边,可以在里边进行判断和数据库操作。$input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");

    E. 附加参数$input->SetAttach("test");

    附加参数,可填可不填,填写的话,里边字符串最好不要出现空格。

    这时候,点击支付应该就可以成功支付了。

    (3)发起支付

    //调用微信JS api 支付

    function jsApiCall()

    {

    WeixinJSBridge.invoke(

    'getBrandWCPayRequest',

    <?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('WeixinJSBridgeReady', jsApiCall, false);

    }else if (document.attachEvent){

    document.attachEvent('WeixinJSBridgeReady', jsApiCall);

    document.attachEvent('onWeixinJSBridgeReady', jsApiCall);

    }

    }else{

    jsApiCall();

    }

    }

    点击立即支付按钮调用的就是 callpay() 函数,他有会调用jsApiCall() 函数打开支付程序。

    c1f06c89216dbf29a4bfc52b73cc04ad.png

    jsApiCall() 函数会监听每一步动作:

    0dc4296c339dad736cbd8adb1c067c43.png

    res.err_msg 为get_brand_wcpay_request:cancel 表明前端判断的取消支付,es.err_msg 为get_brand_wcpay_request:ok 表明前端判断的支付成功,我们可以根据这个将支付跳转到成功页面。

    (4)支持成功回调

    通过前端jsApiCall()函数可以监听支付结果,但是这个并不可信。确认是否支付成功还是应当通过notify.php 处理业务逻辑。前边配置好了支付验证链接SetNotify_url(),支付完成后,微信服务器会根据链接自动请求你的notify.php文件,打开这个文件,其实这个文件最主要的代码就两行:$notify = new PayNotifyCallBack();

    $notify->Handle(false);

    由此跟踪到WxPay.Notify.php类文件的Handle()函数:/**

    *

    * 回调入口

    * @param bool $needSign 是否需要签名输出

    */

    final public function Handle($needSign = true)

    {

    $msg = "OK";

    //当返回false的时候,表示notify中调用NotifyCallBack回调失败获取签名校验失败,此时直接回复失败

    $result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg);

    if($result == false){

    $this->SetReturn_code("FAIL");

    $this->SetReturn_msg($msg);

    $this->ReplyNotify(false);

    return;

    } else {

    //该分支在成功回调到NotifyCallBack方法,处理完成之后流程

    $this->SetReturn_code("SUCCESS");

    $this->SetReturn_msg("OK");

    }

    $this->ReplyNotify($needSign);

    }

    主要代码:$result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg);

    然后来到WxPay.Api.php文件的第411行,notify()函数:

    /**

    *

    * 支付结果通用通知

    * @param function $callback

    * 直接回调函数使用方法: notify(you_function);

    * 回调类成员函数方法:notify(array($this, you_function));

    * $callback 原型为:function function_name($data){}

    */

    public static function notify($callback, &$msg)

    {

    //获取通知的数据

    $xml = $GLOBALS['HTTP_RAW_POST_DATA'];

    //file_put_contents('log.txt',$xml,FILE_APPEND);

    //如果返回成功则验证签名

    try {

    $result = WxPayResults::Init($xml);

    } catch (WxPayException $e){

    $msg = $e->errorMessage();

    return false;

    }

    return call_user_func($callback, $result);

    }

    这里面的$xml=$GLOBALS['HTTP_RAW_POST_DATA'],就是支付成功后用户返回给你的一个结果,他是一个xml格式的字符串。

    b17c914714de7e877ec0cca297d41427.png

    我们可以将这里返回的xml数据记录下来,然后打开看看$out_trade_no就是在支付之前我自己设置的订单号码,$attach就是设置的附加参数。

    得到了这个订单号,然后我就直接在下面写支付成功后的逻辑了,比如改变数据库中的数据等等。

    这样 微信支付的 JsApi支付就大致分析完成了。

    39117eeacd30bad7ee9101307c953e77.png

    展开全文
  • 各位OSCer的开源项目的在线说明文档都什么写的呢? 类似 http://v3.bootcss.com/ Bootstrap的在线文档 这些开源项目的在线文档难道都自己手写html的吗? word的话,代码高亮麻烦。 wiki的话,还得搭建...

    原文地址:http://www.oschina.net/question/1014458_225711

     

    各位OSCer的开源项目的在线说明文档都是用什么写的呢?

    类似

    http://v3.bootcss.com/  Bootstrap的在线文档

    这些开源项目的在线文档难道都是自己手写html的吗?

    word的话,代码高亮麻烦。

    wiki的话,还得搭建wiki,似乎也不是正解。

    一些api自动生成的工具生成的文档的话,效果太差了,也不美观。

    试问有没有一种方便快捷的在线手册编写工具呢?

     
     
    陈一枭陈一枭
    发帖于 1个月前
    3回/197阅
     
    0收藏(4)
     
     

    按票数排序  显示最新答案  共有3个答案 (最后回答: 1周前)

    0
    0
    • RunnerOSC
       
       

      有一款markdown的 js插件可以根据文档标题生成树,这个可以!左边是树形结构,右边是文章。

      效果就是这样,我用着很好用

       

       

       
       
      --- 共有 4 条评论 ---
      • 陈一枭回复 @RunnerOSC : 后来我用了为知笔记,可以生成chm帮助文档格式。 (2周前)  
      • RunnerOSC回复 @陈一枭 : jquery.ztree_toc.js (1个月前)  
      • RunnerOSC回复 @陈一枭 : http://i5ting.github.io/i5ting_ztree_toc/build/jquery.plugin.html(1个月前)  
      • 陈一枭能否告知一下插件名称呢?谢谢 (1个月前)  
      评论(4)引用此答案| 举报 (2015-02-12 11:14)
    0

    转载于:https://www.cnblogs.com/AloneSword/p/4366851.html

    展开全文
  • <div><p>https://pay.weixin.qq.com/wiki/doc/api/danpin.php?chapter=9_102&index=2 看微信的文档加三个参数,但是加了之后好像没有什么效果,没有这个功能吗?</p><p>该提问...
  • 微信h5支付,微信外浏览器支付实现

    万次阅读 热门讨论 2017-10-30 14:15:19
    看一下官方文档还是很必要的,知道必不可少的参数是什么:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1 下面按步骤跟着我做 首先需要APPID,微信支付商户号mch_id,API密钥key,App...

    对接第三方比较重要的点都有什么?

    1.按规则

    2.单独封装

    3.做好出入参

    2021-02-07修改

    看一下官方文档还是很必要的,知道必不可少的参数是什么:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1

    前期步骤及注意事项

    下面按步骤跟着我做

    1. 首先需要APPID,微信支付商户号mch_id,API密钥key,Appsecret(secret),说明在这里https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=3_1
    2. 然后设置支付域名,设置路径:商户平台-->产品中心-->开发配置中设置域名,
    3. 如果是公众号支付就设置对应的,要注意的是公众号支付授权域名为请求的前一级,比如你要请求http://xxx/wx/abc,那么你就设置http://xxx/wx即可
    4. h5支付设置h5域名就行,不用后缀,直接写你要设置的域名(这个一般在申请开通的时候就可以填上去,后设置也行,域名需要备案,可设置为顶级域名,子域名都可访问(在代码中写死此域名,调起支付只能是这个域名之下的网站,比如电商网站域名等而非后端请求域名,证明是在此域名下安全支付的)
    5. partnerkey需要在API中设置,需要安装证书,这个根据提示安装即可,自行设置32位partnerkey

     

     

    我用的是插件IJPay的springboot版,其实说到底就是封装请求,解析请求,有做得好的可以拿过来用,用好了就是自己的

    主要用的的是封装的jar,现在maven库中已经有了

     

    具体代码

    着手代码,一般支付模块的设计都用策略模式,大家可以了解一下

    初始化账号信息

    WxPayApiConfig build = WxPayApiConfig.builder()
                    .appId(wxPayBean.getAppId())
                    .mchId(wxPayBean.getMchId())
                    .partnerKey(wxPayBean.getPartnerKey())
                    .domain(wxPayBean.getDomain())
                    .build();
    
            WxPayApiConfigKit.setThreadLocalWxPayApiConfig(build);
            log.info("wx config 初始化完成");

    封装支付方式

    /**
         * 微信h5支付
         */
        public Result wxH5Pay(PayCoreDTO payCoreDTO) {
            String ip = payCoreDTO.getIp();
            if (StrUtil.isBlank(ip)) {
                ip = "127.0.0.1";
            }
            H5SceneInfo.H5 h5_info = new H5SceneInfo.H5();
            h5_info.setType("Wap");
            //TODO 此域名必须在商户平台--"产品中心"--"开发配置"中添加
            h5_info.setWap_url(permitUrl);
            h5_info.setWap_name(payCoreDTO.getPayDesc());
            H5SceneInfo sceneInfo = new H5SceneInfo();
            sceneInfo.setH5Info(h5_info);
    
            WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig();
           //此处可以设置支付白名单
    //        PayWhite white = payWhiteMapper.getWhite(payCoreDTO.getMid());
            Map<String, String> params = UnifiedOrderModel
                    .builder()
                    .appid(wxPayApiConfig.getAppId())
                    .mch_id(wxPayApiConfig.getMchId())
                    .nonce_str(WxPayKit.generateStr())
                    .body(payCoreDTO.getPayDesc())
                    .attach(payCoreDTO.getAttach())
                    .out_trade_no(payCoreDTO.getOutTradeNo())
    //                .total_fee(white == null ? payCoreDTO.getTotalAmount().toString() : BigDecimalUtil.mulRoundDown(white.getPayDollar(), 100).toString())
                    .total_fee(payCoreDTO.getTotalAmount().toString())
                    .spbill_create_ip(ip)
                    .notify_url(wxPayBean.getDomain())
                    .trade_type(TradeType.MWEB.getTradeType())
                    .scene_info(JSON.toJSONString(sceneInfo))
                    .build()
                    .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
    
            String xmlResult = WxPayApi.pushOrder(false, params);
            Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
            log.info("wx解析xml:{}", result);
            String return_code = result.get("return_code");
            String return_msg = result.get("return_msg");
            if (!WxPayKit.codeIsOk(return_code)) {
                throw new RuntimeException(return_msg);
            }
            String result_code = result.get("result_code");
            if (!WxPayKit.codeIsOk(result_code)) {
                throw new RuntimeException(return_msg);
            }
            // 以下字段在return_code 和result_code都为SUCCESS的时候有返回
            String prepayId = result.get("prepay_id");
            String webUrl = result.get("mweb_url") + "&redirect_url=" + payCoreDTO.getReturnUrl();
    //        String webUrl = result.get("mweb_url");
            log.info("wx pay prepay_id:" + prepayId + " mweb_url:" + webUrl);
            return Result.success(webUrl);
        }
    

    先给出H5ScencInfo

    package com.mtgg.entity;
    import com.jfinal.kit.JsonKit;
    /**
     * @author Javen
     */
    public class H5ScencInfo {
    	private H5 h5_info;
    	
    	public H5 getH5_info() {
    		return h5_info;
    	}
    	public void setH5_info(H5 h5_info) {
    		this.h5_info = h5_info;
    	}
    	@Override
    	public String toString() {
    		return JsonKit.toJson(h5_info);
    	}
    	public static class H5{
    		private String type;
    		private String app_name;
    		private String bundle_id;
    		private String package_name;
    		private String wap_url;
    		private String wap_name;
    		public String getType() {
    			return type;
    		}
    		public void setType(String type) {
    			this.type = type;
    		}
    		public String getApp_name() {
    			return app_name;
    		}
    		public void setApp_name(String app_name) {
    			this.app_name = app_name;
    		}
    		public String getBundle_id() {
    			return bundle_id;
    		}
    		public void setBundle_id(String bundle_id) {
    			this.bundle_id = bundle_id;
    		}
    		public String getPackage_name() {
    			return package_name;
    		}
    		public void setPackage_name(String package_name) {
    			this.package_name = package_name;
    		}
    		public String getWap_url() {
    			return wap_url;
    		}
    		public void setWap_url(String wap_url) {
    			this.wap_url = wap_url;
    		}
    		public String getWap_name() {
    			return wap_name;
    		}
    		public void setWap_name(String wap_name) {
    			this.wap_name = wap_name;
    		}
    	}
    }
    
    
    

    支付回调处理

    注意notify_url要保证能够访问,用域名访问,本地是不行的,要么就用内网穿透工具,网上一搜就出来,注意用外浏览器打开

    最后发送mweb_url就可以打开微信进行支付了

    给出支付成功的返回(这里把退款回调的代码放一起了,不同接口处理也好)

    public CallbackBizDTO notifyDeal(Map<String, String> map){
            String returnCode = map.get("return_code");
            CallbackBizDTO callbackBizDTO = new CallbackBizDTO();
            String reqInfo = map.get("req_info");
            if (StrUtil.isNotEmpty(reqInfo)) {
                //退款回调 
                // 注意重复通知的情况,同一订单号可能收到多次通知,请注意一定先判断订单状态
                if (WxPayKit.codeIsOk(returnCode)) {
                    String decryptData = WxPayKit.decryptData(reqInfo, WxPayApiConfigKit.getWxPayApiConfig().getPartnerKey());
                    Map<String, String> xmlToMap = WxPayKit.xmlToMap(decryptData);
                    log.info("wx退款通知解密后的数据=" + xmlToMap);
                    callbackBizDTO.setOutTradeNo(xmlToMap.get("out_trade_no"));
                    callbackBizDTO.setTradeNo(xmlToMap.get("transaction_id"));
                    callbackBizDTO.setTotalAmount(Long.valueOf(xmlToMap.get("total_fee")));
                    callbackBizDTO.setMchId(map.get("mch_id"));
                    callbackBizDTO.setAppid(map.get("appid"));
                    callbackBizDTO.setTradeStatus(returnCode);
    //                callbackBizDTO.setPassbackParams(xmlToMap.get("attach"));
                    callbackBizDTO.setRefundFee(Long.parseLong(xmlToMap.get("refund_fee")));
                    callbackBizDTO.setRefundNo(xmlToMap.get("out_refund_no"));
                    callbackBizDTO.setGmtRefund(xmlToMap.get("success_time") + ".000");
                    Map<String, String> xml = new HashMap<String, String>(2);
                    xml.put("return_code", "SUCCESS");
                    xml.put("return_msg", "OK");
                    callbackBizDTO.setReturnStr(WxPayKit.toXml(xml));
                    return callbackBizDTO;
                }
                log.error("验签失败:{}", returnCode);
                return null;
            } else {
                // 注意重复通知的情况,同一订单号可能收到多次通知,请注意一定先判断订单状态
                // 注意此处签名方式需与统一下单的签名类型一致
                if (WxPayKit.verifyNotify(map, WxPayApiConfigKit.getWxPayApiConfig().getPartnerKey(), SignType.HMACSHA256)) {
                    if (WxPayKit.codeIsOk(returnCode)) {
                        String appid = map.get("appid");
                        String mchId = map.get("mch_id");
    //                String totalFee = map.get("total_fee");
                        String cashFee = map.get("cash_fee");
                        String transactionId = map.get("transaction_id");
                        String outTradeNo = map.get("out_trade_no");
                        String attach = map.get("attach");
                        String timeEnd = map.get("time_end");
    
                        callbackBizDTO.setOutTradeNo(outTradeNo);
                        callbackBizDTO.setTradeNo(transactionId);
                        callbackBizDTO.setTotalAmount(Long.valueOf(cashFee));
                        callbackBizDTO.setPassbackParams(attach);
                        callbackBizDTO.setTradeStatus(returnCode);
                        callbackBizDTO.setAppid(appid);
                        callbackBizDTO.setMchId(mchId);
                        // 更新订单信息 发送通知等
                        Map<String, String> xml = new HashMap<String, String>(2);
                        xml.put("return_code", "SUCCESS");
                        xml.put("return_msg", "OK");
                        callbackBizDTO.setReturnStr(WxPayKit.toXml(xml));
                        return callbackBizDTO;
                    }
                }
                log.error("wx回调验签失败::{}", map);
                return null;
            }
        }

    最后封装需要返回的参数

    这里需要注意最后的xml.put(),return PaymentKit.toXml(xml)一定要返回给微信,SUCCESS表示商户接收通知成功并校验成功,这样微信才会知道商户支付成功,否则会不断通知,这样就会重复处理数据,这个错误是致命的

    上面回调我改了一下,可以做到闭嘴,不会重复通知

    示例

    下面就是测试调起微信支付

    常见错误及注意事项:

    1、网络环境未能通过安全验证,请稍后再试(IP改变导致的) 
    2、商家参数格式有误,请联系商家解决(H5支付的referer为空导致) 
    3、商家存在未配置的参数,请联系商家解决(H5支付的域名问题) 
    4、支付请求已失效,请重新发起支付(有效期为5分钟) 

    5、请在微信外打开订单,进行支付(H5支付不能直接在微信客户端内调起)

    6.已经调起微信支付了,但是点击立即支付的时候报商家参数配置错误:有一种情况就是 调起支付参数比较严谨,需要填写真实IP,否则会报缺少参数,其次支付描述需要为当前业务描述

     

    支付完成跳转

    支付完成前端如果要跳转,可以设置微信下单返回的mweb_url+"&redirect_url=" + returnUrl;这样就能够跳转到指定地址,这个官方文档也有提到

     

     

    支付说到底就是封装,安全调用,微信都是返回预支付id,要细心

     

    支付服务代码设计(策略模式,可扩展,接入方便): https://blog.csdn.net/Goligory/article/details/106740171

     

    需要项目源码的私我(源码包括设计)

     

     

    展开全文
  • jboss微内核

    2009-01-15 23:06:04
    基于JMX,易于管理、便于扩展、热部署、模块化。...什么是微内核 http://www.jboss.org/community/docs/DOC-10671 什么是微容器 http://www.jboss.org/community/docs/DOC-10668   JBos...
  • laravel-restful-api-starter, 使用 Laravel 和MongoDB构建一个 RESTful API #Laravel Restful API启动程序现在查看...是什么?这里启动器基于以下功能:Laravel 4.2: 使用轻量级的时尚框架使用MongoDB进行存储,仍然对
  • Sqlmap学习笔记(零)

    千次阅读 2019-05-30 13:22:03
    https://blog.werner.wiki/sqlmap-study-notes-0/ 零、前言 这篇文章是我学习Sqlmap的用法时做的笔记,...一、Sqlmap是什么 Sqlmap是开源的自动化SQL注入工具,由Python写成,具有如下特点: 完全支持MySQL、O...
  • 最近为公司开发一个新功能,具体是什么不重要,主要是这个功能需要对接微信支付,需要在微信页面调起微信支付 基本上我也是初次接触微信支付的对接,所以我先去看了微信的支付开发文档地址如下: ...
  • 微信支付全部详细流程

    万次阅读 2018-07-09 01:50:07
    微信支付时序图 官方文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_51、什么是时序图 一种UML交互图,描述了对象之间传递消息的时间顺序, 用来表示用例中的行为顺序, 强调消息时间顺序...
  • TeX、LaTeX、TeXLive 小结

    2011-09-25 22:28:00
    在线的(blog、wiki、google doc、google site、...) 离线的(wiki、LaTeX、sphinx、docbook、doxygen...) ... 然后觉得 git + sphinx 应该个不错的选择,恩,生成网页、qthelp、chm文件等都还不错,可是,...
  • 转自:...一、OSM是什么  开放街道图(OpenStreetMap,简称OSM)是一个网上地图协作计划,目标是创造一个内容自由且能让所有人编辑的世界地图(wiki:ht
  • 本文转自:https://blog.werner.wiki/sqlmap-study-notes-0/ 感谢作者的整理,如有侵权,立删 零、前言 这篇文章是我学习Sqlmap的用法时做的笔记...一、Sqlmap是什么 Sqlmap是开源的自动化SQL注入工具,由Pyth...
  • https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5 什么是时序图? 一种UML交互图,描述了对象之间传递消息的时间顺序, 用来表示用例中的行为顺序, 强调消息时间 说白了就是你一个操作的流程,这...
  • 1、什么是[统一下单接口]? 首先我们要明白这个问题,需要先行看一下微信的官方文档: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1 2.开发 //微信支付,生成统一订单 private void wxPay...
  • 首先要明确自己要做的事情是什么,点击支付按钮以后,出现一个输入支付密码的框如上图所示,调出微信支付的页面,那么我们要做的事情就是调出这个框,其他事情交给微信来做然后明确需要什么参数,通过查看微信公众号支付...
  • java微信三方支付

    2019-02-14 13:32:02
    微信官方文档无从下手的,可以从这篇文章中找找灵感 以扫码支付为例,...首先微信也需要参数的,不过和支付宝初始化参数不同,支付宝初始化参数固定的,而微信参数根据提供的接口需要什么参数,...
  • PHP微信支付开发

    2018-09-20 07:55:00
    此链接https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_2,微信官方的示例,无效,报错。 1.申请微信支付的开通条件?什么样的账号可以申请微信支付? 只有服务号可以申请微信支付,服务号只有企业...
  • 0、知识点 JSSDK微信支付(本次开发采用微信支付) H5支付 ... ...用户通过微信扫描二维码,在微信内进入商家的H5页面,并在微信内调用JSSDK完成支付 ...开发文档:...2、什么是JSSDK? 可...
  • 原文:https://iot.weixin.qq.com/wiki/doc/wifi/AirKissDoc.pdf Air Kiss 技术一种创新性的信息传递技术。通过该技术可以便捷的向一台 与外界没有建立任何一种实质性连接(包括有线、无线、蓝牙、NFC 等)的设备传 ...
  • 微信支付文档:https://pay.weixin.qq.com/wiki/doc/api/index.html 在trade_type参数中我们有很多中选择,不同的参数代表我们不同的场景,不同的场景校验的参数以及链路不同的,比如在小程序、微信内置支付需要...
  • https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5 但是你可以发现自己严格按照对接文档写完代码,再支付的时候无论如何都返回你-1 当然排除服务器给你返回的参数有错外,最大的原因就是 你自认为...

空空如也

空空如也

1 2 3 4
收藏数 64
精华内容 25
关键字:

wikidoc是什么