微信公众号支付(记录)

springboot使用com.github.binarywang 包实现微信网页上的支付和退款 wxpay:notifuyUrl 是 支付回调地址refundNotifyUrl是 退款回调地址这两个地址都必须是外网可访问的地址。 阅读详情

公众号微信支付开发

1.第一步:设置微信支付目录,这个地址指到支付页面的上一级即可。

例如:支付页面的地址是http://www.baidu.com/wechat/pay/shopping,只需填写http://www.baidu.com/wechat/pay/,

一定要以"/"(左斜杆)符号结尾。

 

2.第二步:设置授权域名,授权域名是为了获取支付中不可缺少的参数openid。每个用户对于每个公众号的openid都是不同的且是唯一的,即是说一个用户在不同的公众号中,他的openid是不同的,并且一直不变。在开发中可以事先获取你自己的在这个公众号(正式公众号,具有支付权限的)的openid,然后就可以跳过授权过程,直接开发并测试支付功能。

 

3.第三步:引入微信开发jar包,这是别人已经封装好的微信支付API,当然也可以使用官方的微信支付SDK,不过为了方便快速开发,

所以这里我使用了封装好的别人封装好的API,这是API文档的github地址:https://github.com/wechat-group/weixin-java-tools/wiki ,里面有具体的使用方法和开发步骤,如果你嫌看文档麻烦的话可以直接看我的开发步骤:

这是基于springboot开发的,首先引入jar包:

        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-pay</artifactId>
            <version>3.1.4.BETA</version>
        </dependency>    

 

4.加入微信开发包两个基本类:

(1)在springboot配置文件application.properties中加入微信支付基本参数:

#微信公众号或者小程序等的appid
wechatpay.appId =

#微信支付商户号
wechatpay.mchId =

#微信支付商户密钥
wechatpay.mchKey=

#服务商模式下的子商户公众账号ID,用不上就注释掉
#wechatpay.subAppId=

#服务商模式下的子商户号,用不上就注释掉
#wechatpay.subMchId=

# p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)用不上就注释掉
#wechatpay.keyPath=

 

 

 

(2)添加支付配置文件参数类WxPayProperties:

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * wxpay pay properties
 *
 * @author Binary Wang
 */
@ConfigurationProperties(prefix = "wechatpay")
public class WxPayProperties {
    /**
     * 设置微信公众号的appid
     */
    private String appId;

    /**
     * 微信支付商户号
     */
    private String mchId;

    /**
     * 微信支付商户密钥
     */
    private String mchKey;

    /**
     * 服务商模式下的子商户公众账号ID,普通模式请不要配置,请在配置文件中将对应项删除
     */
    private String subAppId;

    /**
     * 服务商模式下的子商户号,普通模式请不要配置,最好是请在配置文件中将对应项删除
     */
    private String subMchId;

    /**
     * apiclient_cert.p12文件的绝对路径,或者如果放在项目中,请以classpath:开头指定
     */
    private String keyPath;

    public String getAppId() {
        return this.appId;
    }

    public void setAppId(String appId) {
        this.appId = appId;
    }

    public String getMchId() {
        return mchId;
    }

    public void setMchId(String mchId) {
        this.mchId = mchId;
    }

    public String getMchKey() {
        return mchKey;
    }

    public void setMchKey(String mchKey) {
        this.mchKey = mchKey;
    }

    public String getSubAppId() {
        return subAppId;
    }

    public void setSubAppId(String subAppId) {
        this.subAppId = subAppId;
    }

    public String getSubMchId() {
        return subMchId;
    }

    public void setSubMchId(String subMchId) {
        this.subMchId = subMchId;
    }

    public String getKeyPath() {
        return this.keyPath;
    }

    public void setKeyPath(String keyPath) {
        this.keyPath = keyPath;
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this,
                ToStringStyle.MULTI_LINE_STYLE);
    }
}

 

 

(3)初始化微信支付配置类WxPayConfiguration:

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;

/**
 * @author Binary Wang
 */
@Configuration
@ConditionalOnClass(WxPayService.class)
@EnableConfigurationProperties(WxPayProperties.class)
public class WxPayConfiguration {
    private WxPayProperties properties;

    @Autowired
    public WxPayConfiguration(WxPayProperties properties) {
        this.properties = properties;
    }

    @Bean
    @ConditionalOnMissingBean
    public WxPayService wxService() {
        WxPayConfig payConfig = new WxPayConfig();
        
        payConfig.setAppId(StringUtils.trimToNull(this.properties.getAppId()));
        payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId()));
        payConfig.setMchKey(StringUtils.trimToNull(this.properties.getMchKey()));
        payConfig.setSubAppId(StringUtils.trimToNull(this.properties.getSubAppId()));
        payConfig.setSubMchId(StringUtils.trimToNull(this.properties.getSubMchId()));
        payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath()));

        WxPayService wxPayService = new WxPayServiceImpl();
        wxPayService.setConfig(payConfig);
        return wxPayService;
    }

}

 

5.生成支付订单:

import com.alibaba.fastjson.JSONObject;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.park.pojo.park.ParkingRecord;
import com.park.service.Interface.ParkService;
import com.park.utils.parkInterfaceUtil.ParkInterfaceRequestParam;
import com.park.utils.parkInterfaceUtil.ParkProtocolParamUtil;
import com.park.utils.wechatUtil.ConstantUtil;
import com.park.utils.wechatUtil.HttpRequest;
import com.park.utils.wechatUtil.SignUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 微信支付接口
 */
@Slf4j
@RestController
@RequestMapping(value = "/wechat/pay")
public class WechatPayController {

    @Autowired
    private WxPayService wxService;

    /**
     * 统一下单
     * 在发起微信支付前,需要调用统一下单接口,返回微信支付的所需要的参数
     * 接口地址:https://api.mch.weixin.qq.com/pay/unifiedorder
     *
     * @param request 请求对象,注意一些参数如appid、mchid等不用设置,方法内会自动从配置对象中获取到(前提是对应配置中已经设置)
     */
    @PostMapping("/getPayInfo")
    public WxPayMpOrderResult getPayInfo(@RequestBody WxPayUnifiedOrderRequest request , HttpServletRequest httpServletRequest) throws WxPayException,Exception {

        request.setOutTradeNo(SignUtil.buildRandom(10));                                         //随机字订单号
        request.setSpbillCreateIp(ConstantUtil.getRemortIP(httpServletRequest));                    //用户ip
        request.setTradeType("JSAPI");                                                              //公众号支付
        request.setNonceStr(SignUtil.createNonceStr());                                             //随机字符串
        request.setNotifyUrl("http://qwrerewrwqewq/wechat/pay/PayResultNotify");                //回调通知支付结果地址(必须外网能访问的地址)
        request.setDeviceInfo("WEB");                                                               //客户终端类型
        request.setSignType("MD5");                                                                 //加密方式(必须参数,虽然官方文档说是非必需,亲测不加一直报签名错误)

        return this.wxService.createOrder(request);
    }

    /**
     * 接受微信支付返回通知
     * @param request
     * @param response
     * @throws IOException
     */
    @RequestMapping("/PayResultNotify")
    public void PayResultNotify(HttpServletRequest request, HttpServletResponse response) throws IOException {
        log.info("微信支付返回通知函数开始---------------------");

        InputStream inStream = request.getInputStream();
        ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = inStream.read(buffer)) != -1) {
            outSteam.write(buffer, 0, len);
        }
        outSteam.close();
        inStream.close();
        String result = new String(outSteam.toByteArray(), "utf-8");
        boolean isPayOk =false;
        WxPayOrderNotifyResult wxPayOrderNotifyResult =null;

        // 此处调用订单查询接口验证是否交易成功
        try {
            wxPayOrderNotifyResult = wxService.parseOrderNotifyResult(result);
            if("SUCCESS".equals(wxPayOrderNotifyResult.getResultCode())){
                isPayOk=true;
            }
            log.info("解析数据:"+wxPayOrderNotifyResult.toString());
        } catch (WxPayException e) {
            e.printStackTrace();
        }

        String noticeStr="";


        // 支付成功,商户处理后同步返回给微信参数
        PrintWriter writer = response.getWriter();
        if (isPayOk) {
          //建议在这里处理付款完成的业务(虽然前端也可以处理后续业务,但是前端处理并不安全,例如:客户突然关闭浏览器了等情况,付款成功后续的业务将中断)
                System.out.println("===============付款成功,业务处理完毕==============");
                // 通知微信已经收到消息,不要再给我发消息了,否则微信会8连击调用本接口
                noticeStr = setXML("SUCCESS", "OK");
                log.info("收到通知返回给微信api信息:-----------"+noticeStr);
                writer.write(noticeStr);
                writer.flush();
            
        } else {

            // 支付失败, 记录流水失败
            noticeStr = setXML("FAIL", "");
            writer.write(noticeStr);
            writer.flush();
            System.out.println("===============支付失败==============");
        }



    }

    public static String setXML(String return_code, String return_msg) {
        return "<xml><return_code><![CDATA[" + return_code + "]]></return_code><return_msg><![CDATA[" + return_msg + "]]></return_msg></xml>";
    }
}

 

 

6.所用到的工具类:

import javax.servlet.http.HttpServletRequest;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Date;
import java.util.UUID;

public class SignUtil {
    private static String token = "weixin";

    /**
     * 获取acassToken校验
     * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
    public static boolean checkSignature(String signature, String timestamp, String nonce) {
        boolean result = false;

        // 对token、timestamp和nonce按字典序排序
        String[] array = new String[]{token, timestamp, nonce};
        Arrays.sort(array);

        // 将三个参数字符拼接成一个字符串
        String str = array[0].concat(array[1]).concat(array[2]);

        String sha1Str = null;
        try {
            // 对拼接后的字符串进行sha1加密
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            byte[] digest = md.digest(str.getBytes());
            sha1Str = byte2str(digest);
        }
        catch(Exception e) {
        }

        if(sha1Str != null &&  sha1Str.equals(signature)) {
            result = true;
        }

        return result;
    }

    /*
     * 将字节数组转换成字符串
     */
    public static String byte2str(byte[] array) {
        StringBuffer hexstr = new StringBuffer();
        String shaHex="";
        for(int i = 0; i < array.length; i++) {
            shaHex = Integer.toHexString(array[i] & 0xFF);
            if(shaHex.length() < 2) {
                hexstr.append(0);
            }
            hexstr.append(shaHex);
        }
        return hexstr.toString();
    }

    /**
     * 获取acaccessToken
     * @param grant_type
     * @param appid
     * @param secret
     * @return
     */
    public static String getAcaccessToken(String grant_type,String appid,String secret){

        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type="+grant_type+"&appid="+appid+"&secret="+secret;
        String Str = HttpRequest.httpRequestGet(url);
        return Str;
    }

    /**
     * 创建随机字符串
     * @return
     */
    public static String createNonceStr() {
        return UUID.randomUUID().toString().substring(0, 20);
    }

    /**
     * 获取时间戳
     * @return
     */
    public static String getCurrTime(){

        long times = new Date().getTime();
        return times+"";
    }

    /**
     * 随机数
     * @param length
     * @return
     */
    public static String buildRandom(int length){
        long times = new Date().getTime();
        int randomNum = (int)((Math.random()*9+1)*(10*length));

        return randomNum+""+times;
    }

    /**
     * 获取用户IP
     * @param request
     * @return
     */
    public static String getRemortIP(HttpServletRequest request) {
        if (request.getHeader("x-forwarded-for") == null) {
            return request.getRemoteAddr();
        }
        String ipListStr = request.getHeader("x-forwarded-for");
        if(!(ipListStr.indexOf(",")<0)){
            String [] list = ipListStr.split(",");
            return list[0];                                 //当服务部署使用代理,其获取到的IP地址将会是多个,取第一个
        }else {
            return ipListStr ;
        }

    }
}

 

7.前端代码:

前端使用的VUE,逻辑代码如下:

getPayInfo(params){                                              //调用统一下单接口获取js支付参数  参数:金额、商品名称等 具体可以看统一接口的接收参数类WxPayUnifiedOrderRequest
        this.$api.gotoPay(params).then(res=>{  
          if(res!=null){
            this.payInfo.appId = res.data.appId;
            this.payInfo.timeStamp = res.data.timeStamp;
            this.payInfo.nonceStr = res.data.nonceStr;
            this.payInfo.packages = res.data.packages;
            this.payInfo.sign = res.data.sign;
          }
        })
      },
      onBridgeReady(){                                //使用微信浏览器内置的对象调起微信支付插件,并传入统一接口返回的参数
        WeixinJSBridge.invoke(
          'getBrandWCPayRequest', {
            "appId":this.payInfo.appId,                 //公众号名称,由商户传入
            "timeStamp":this.payInfo.timeStamp,         //时间戳,自1970年以来的秒数
            "nonceStr":this.payInfo.nonceStr,           //随机字符串
            "package":this.payInfo.packages,            //支付验证pay_id
            "signType":"MD5",                           //微信签名方式
            "paySign":this.payInfo.sign                 //微信签名
          },
          function(res){
            if(res.err_msg == "get_brand_wcpay_request:ok" ){
              // 使用以上方式判断前端返回,微信团队郑重提示:
              //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
            }
          });
      }
      ,
      Gopay(){                                            //点击付款按钮开始支付
        console.log("开始支付")
        if (typeof WeixinJSBridge == "undefined"){
          if( document.addEventListener ){
            document.addEventListener('WeixinJSBridgeReady', this.onBridgeReady(), false);
          }else if (document.attachEvent){
            document.attachEvent('WeixinJSBridgeReady', this.onBridgeReady());
            document.attachEvent('onWeixinJSBridgeReady', this.onBridgeReady());
          }
        }else{
          this.onBridgeReady();
        }
      }

 

(8)测试支付功能:

可以将支付页面的地址发送到正式的公众号(必须要正式的公众号才行,而且后台支付相关的参数也要用正式,同时要用传入的openid的那个用户点击才能测试,一般是本人的),然后点击开始测试支付。

最后附上参考文章:https://www.cnblogs.com/chenziyu/p/9656267.html

微信统一下单手把手教你微信app 小程序支付 com.github.binarywang.wxpay.service.impl.BaseWxPayServiceImpl的createOrder其中封装了app 微信小程序支付 navtive 支付。appId: xxxxxxxxxxxxxxx#微信公众号或者小程序等的appid wxb3c1ffaa4b36b72f。mchKey: xxxxxxxxxxxxxx#微信支付商户密钥。mchId: xxxxxxx#微信支付商户号。// 设定每次读取字符个数。// 建立输入流读取类。} 解析xml为字符串。 阅读详情

相关推荐

微信支付学习笔记之调用com.github.binarywang.wxpay.service接口

接口链接:https://github.com/binarywang 使用步骤: 将HttpServletRequest转成 ip /** * 获得请求地址ip * @param httpservletrequest * @return */ public static String getClientIP(HttpServletRequest httpservletrequest) { if (httpservletrequest == null) return null; String s = httpservlet

java 微信公众号微信支付

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 微信支付开发 首先引入github 微信支付和公众号支持库 <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-mp</artifactId> <version>4.1.0</version>

qq_40833411的博客 1689

金融数据自动化:从同花顺API到Excel的智能转换之旅

本文详细介绍了如何利用同花顺API实现金融数据自动化处理,并将其智能转换为Excel格式的全流程。通过Python编程和Excel高级技巧,读者可以掌握从数据获取、清洗到输出的完整解决方案,大幅提升金融数据分析的效率和准确性。文章特别强调了同花顺API的使用技巧和Excel自动化输出的最佳实践。

sql99的博客 462

微信公众号JSAPI支付开发记录

一,设置支付目录 也就是要调起微信支付的页面,有两个例子可以参考下,我用的是tp5.1框架 1,http://www.abc.com/index/goods/order?gid=70&type=1&nums=1这种带参格式的设置成http://www.abc.com/index/goods/order 2,http://www.abc.com/index/order/det...

xxs18326183038的博客 387

基于Python适用于YOLO目标检测算法的图片数据增强处理

为了增强模型的鲁棒性以及数据的丰富性,同 时为了防止由于数据过少发生过拟合,本设计对数 据集进行数据增强处理,包括随机亮度调节、随机 对比度调节、随机饱和度调节、加入高斯噪声、水 平翻转、运动模糊和旋转 15°

weixin_67136409的博客 700

Unity3D移动平台简单实现

在电子游戏中移动平台可谓是十分常见的,如平台从一处至另一处的来回移动,或当需要玩家触发机关时,平台浮动并按一定的路线移动至目标处。本文主要是在Unity3D引擎下使用少量脚本实现两点之间来回移动平台的最基本功能,是一种比较简单且好理解的移动平台解决方案。 涉及到的点如下: 平台对象的实现 平台移动路线的设定 处于平台上游戏对象(如:玩家)的相对运动 创建平台控制对象 创建平台实...

长溪木可的博客 4683

微信公众号开发之微信支付代码记录

需求说明 这个需求说明是完全没有必要的,但是还是写一下吧,但凡是做公众号的,一般都是需要了解这个微信支付的,不然基本的业务都没办法走,所以今天简单的记录一下微信支付的一些问题以及流程是怎么样的。记录的是jsapi支付,别的支付方式暂时没有记录,也就是拉起来付款界面的支付。 微信支付产品 https://pay.weixin.qq.com/static/product/product_index.s...

红岸基地 2128

鸿蒙手机卸载内置应用 adb连接

**傻瓜式删除鸿蒙系统内置应用,自己亲测有效。**

JJDXBT的博客 3万+

微信支付(微信公众号支付) [记录]

后台   先获取code code有效5min    public string GetCodeUrl(string Appid, string redirect_uri)     {   return string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&a...

weixin_30414245的博客 154

YOLO26改进 - 注意力机制 | MLLAttention (Mamba-Like Linear Attention) 类Mamba线性注意力:动态感受野适配多尺度目标

本文介绍了Mamba-Like Linear Attention (MLLA)模型及其在yolo26中的集成。MLLA结合了Mamba和线性注意力Transformer的优点,线性注意力降低计算复杂度,Mamba有效建模序列。该模型将Mamba的遗忘门和块设计等关键元素与线性注意力结合,还可用位置编码替代遗忘门。我们将MLLA引入yolo26,在检测头的不同尺度特征图上应用。实验表明,改进后的yolo26在目标检测任务中表现良好,体现了MLLA在提升模型性能上的有效性。

魔改工程师的博客 1150

Arduino ESP8266通过 RF433数据收发实验

Arduino ESP8266通过 RF433射频模块实现数据收发实验 写这篇文章,折腾了2天,在没有成功之前,一直在摸索和采坑当中,不要问我黑暗和黎明之间有多长。开发很多时候只问结果,不问过程的,在这里分享来之不易的结果,希望后面的人不要采坑,有成功的案例先河,后面与之相关的应用开发只需要套用模板修改即可实现。 实物搭建 RF433模块 我使用的是这个:nodemcu 本案例开发所使用到的库:RadioHead:http://www.airspayce.com/mikem/

perseverance51博客 3808

微信公众号发起支付记录(后端)

1.流程 首先准备微信支付统一配置,进入可能发起支付的页面时,将要支付的手机端网页url传入后台,返回四个参数,写进函数wx.config进行授权 注:这是前端调用微信的统一配置,对真正调起手机微信支付没有影响 然后在真正要在手机端拉起支付页面时,先将openid传入后台,后台根据openid和其他参数向微信端统一下单接口发送请求,返回prepay_id,再根据结合其他参数传给手机前端,前端调用wx.chooseWxPay函数拉起微信支付界面 注:流程中有三个签名(图中的signature和

qq_35352422的博客 704

CAPL控制程控电源

汽车电子测试过程中,除了实车测试,还有台架测试,在进行台架测试时,都需要通过电源来模拟汽车电瓶给ECU供电,如果要进一步进行比较高效的压力测试或自动化测试,就需要用到程控电源,所以本章主要介绍CAPL是如何来控制程控电源的。

测试领域技术分享 4389

微信公众号支付整体流程记录备忘

相比支付宝支付,微信公众号支付的实现以及过程真的是比较复杂,而且坑多,都是血泪史。   首先,需要登录微信公众平台,https://mp.weixin.qq.com   查看微信支付的开发配置,这里就可以看到对应的支付授权目录以及测试目录,可以选择使用线上作为支付测试,但是不推荐。使用测试授权目录时,注意需要设置测试白名单,规定哪些人可以进行支付测试。         当然,

clamaa的专栏 1941

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

微信公众号支付JSAPI 详细记录

刚刚调试通微信公众号支付,写个博客记录一下。 jsapi必要的几个参数 微信公众号的账户密码,微信商户账号密码. 登陆微信公众号,左下角开发-基本配置,查看APPID 1、公众APPID(已经得到) 2、APPSECEPT(已经得到)   进入微信商户平台: https://pay.weixin.qq.com/index.php/partner/public/home 3...

qq_19662519的博客 1647

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

微信公众号支付--错误记录

微信公众号支付调用统一下单接口时,微信返回的数据一定要二次组装再给前台,否则会有问题的,正确示范如下: /** * 获取weixin支付的返回信息 * @param payOrderId * @return */ @Override public String getPayInfo(String payOrderId,Str...

weixin_30852419的博客 278

记录:SpringBoot 开发之集成微信公众号支付

使用场景:用于停车场收费系统,当车辆还在场内时,车主可以通过公众号里面的预缴费功能给车辆先缴停车费用,出场时可直接出场 用户使用流程: 车主打开微信公众号,进入预缴费功能界面 输入车牌号获取车辆停车信息 点击预交费生成停车缴费订单 点击支付跳转至微信支付界面 输入密码完成支付后点击完成界面关闭 业务实现流程: 根据车牌号获取车辆停车信息 根据车辆停车信息生成车辆缴费订单信息 根据车辆缴费订单信息拼接微信统一支付参数,并调用微信统一支付接口 支付完成后同步回调跳转至支付完成界面,异步回调跳转至支付成功接

myinsert的博客 507

记录最近调通微信公众号支付的过程

写这篇文章记录最近一次接入微信公众号支付的一些思路。 首先无论是支付宝还是微信用h5编写的代码想获取微信的授权都必须发一个get请求给https://open.weixin.qq.com/connect/oauth2/authorize,后面的参数省略,其中有一个参数redirect_uri很重要这个是授权返回的你本地程序的url你可以在这个返回的过程中带几个自己的参数。 [HttpGet] public ActionResult McrMsgOAuth...

linshichen的专栏 349

php获取微信收款记录,微信公众号开发之微信支付代码记录的实现

需求说明这个需求说明是完全没有必要的,但是还是写一下吧,但凡是做公众号的,一般都是需要了解这个微信支付的,不然基本的业务都没办法走,所以今天简单的记录一下微信支付的一些问题以及流程是怎么样的。记录的是jsapi支付,别的支付方式暂时没有记录,也就是拉起来付款界面的支付。微信支付产品微信开发步骤这里简单的说一下,我们打开这哥链接以后其实是官方截图的配置,有一个支付配置和设置授权域名首先是支付配置:最...

weixin_35829279的博客 885

微信公众号支付开发指南(初版,可能没有再版...) ——某行微信支付项目开发记录

微信公众号支付文档解释及要点说明

水月灬清影的博客 1157
上一篇: 让程序员崩溃的瞬间(前方高能)
下一篇: 新版本Postman解决token传参问题(记录)
Xu-BinBin
博客等级 码龄9年 7粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值