微信扫码直接支付

近些时间也一直在研究支付这一块的东西,查看支付宝支付和微信支付的官网api,支付类型也有很多种,最简单的也是直接支付。刚开始接触微信支付,也是像大多数新手一样网上各种百度,到现在才觉得这种做法永远是事半功倍,看官方api和使用sdk要快的多。

微信支付官方文档:https://pay.weixin.qq.com/wiki/doc/api/index.html

GitHub上微信sdk下载地址:https://github.com/wxpay/WXPay-SDK-Java(一定要看sdk中readme案例)

需要准备的一些微信支付的参数appId、mchId、publicKey、appSecret,当然这些参数不需要我们程序员去关心。先不去谈实现细节,先说说微信扫码直接支付需要的大致步骤:

1.准备微信支付参数例如上面说的appId、mchId等;

2.准备待支付商品的信息,例如out_trade_no商户订单号、body商品描述、total_fee支付的金额、trade_type交易类型、notify_url通知的url(支付成功之后微信服务器请求你的项目服务器的地址)等;

3.统一下单,统一下单就是准备好这些参数之后,去请求微信的服务器,如果你的参数填写没有问题,微信服务器或返回给你一些参数信息,这些信息中就有一个参数叫做code_url,这个就是我们微信直接支付需要的东西,拿着这个code_url去生成二维码,打开微信扫一扫就能完成支付。

4.刚才我们准备了一个notify_url,当我们支付完成之后微信服务器会请求这个网址,并携带一些参数信息,这些参数信息绝大部分就是我们第2部中提交的参数信息,接下来我们在数据库中修改订单状态就行了,代表一个订单完成。

统一下单api:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

***切记必填的参数一定要填,注意好参数的长度限制。

***微信直接支付的话trade_type为NATIVE,其他的值代表着不同的支付类型,像JSAPI代表着公众号支付(比微信直接支付稍微麻烦一点,但是原理都差不多,建议弄完微信直接支付可以去了解一下公众号支付)

***其实微信支付里面特别多的签名,但是如果我们用好sdk,根本不用担心签名的问题,别人都已经写的非常好了,这就叫站在巨人的肩膀上看的更远吧。

支付成功之后的通知:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7

好吧,上一个例子你们就更容易理解了。

1.配置类MyConfig,我们自己的config,对应的参数替换掉就可以了
import com.github.wxpay.sdk.WXPayConfig;
import java.io.*;


public class MyConfig implements WXPayConfig{


    private byte[] certData;


    public MyConfig() throws Exception {
        String certPath = "/path/to/apiclient_cert.p12";
        File file = new File(certPath);
        InputStream certStream = new FileInputStream(file);
        this.certData = new byte[(int) file.length()];
        certStream.read(this.certData);
        certStream.close();
    }


    public String getAppID() {
        return "wx8888888888888888";
    }


    public String getMchID() {
        return "12888888";
    }


    public String getKey() {
        return "88888888888888888888888888888888";
    }


    public InputStream getCertStream() {
        ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
        return certBis;
    }


    public int getHttpConnectTimeoutMs() {
        return 8000;
    }


    public int getHttpReadTimeoutMs() {
        return 10000;
    }
}
2.统一下单:


import com.github.wxpay.sdk.WXPay;


import java.util.HashMap;
import java.util.Map;


public class WXPayExample {


    public static void main(String[] args) throws Exception {


        MyConfig config = new MyConfig();
        WXPay wxpay = new WXPay(config);/*WXPay 是sdk中的*/


        Map<String, String> data = new HashMap<String, String>();
/*
必要的参数一定要加上,没必要的参数可加可不加
*/
        data.put("body", "美宜侬共享咖啡机);
        data.put("out_trade_no", "2016090910595900000012");
        data.put("device_info", "");
        data.put("fee_type", "CNY");
        data.put("total_fee", "1");
        data.put("spbill_create_ip", "123.12.12.123");//这个ip可以根据用户的请求头request去获取
        data.put("notify_url", "http://www.example.com/wxpay/notify");//这就是上面写的回调函数
        data.put("trade_type", "NATIVE");  // 此处指定为扫码支付
        data.put("product_id", "12");


        try {
            Map<String, String> resp = wxpay.unifiedOrder(data);//resp就是返回的全部参数
String code_url=resp.get("code_url");//这就是支付的url了
          
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}
最后用户支付成功之后,我们在项目中对我们先前填写的 notify_url进行拦截就行了,更改数据库中订单的状态就行。

***切记我们处理完之后,一定通知微信服务器我们处理完成了,这个在https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7里面有,如果不返回,微信服务器会隔一段时间调我们的notify_url。

大概就这么多,微信公众号支付和支付宝支付也都差不多,有时间我也会整理整理,也算是自己回顾。



发布了7 篇原创文章 · 获赞 11 · 访问量 4285

猜你喜欢

转载自blog.csdn.net/qq_38662806/article/details/79046196
今日推荐