WeChat QRコードでのお支払い

132416 ワード

一、マイクロサービスの作成
1、導入依存


    com.github.wxpay
    wxpay-sdk
    0.0.3


    
    org.apache.httpcomponents
    httpclient

2、必要な工具類
Http Client:http/https関連操作
public class HttpClient {
     
    private String url;
    private Map<String, String> param;
    private int statusCode;
    private String content;
    private String xmlParam;
    private boolean isHttps;

    public boolean isHttps() {
     
        return isHttps;
    }

    public void setHttps(boolean isHttps) {
     
        this.isHttps = isHttps;
    }

    public String getXmlParam() {
     
        return xmlParam;
    }

    public void setXmlParam(String xmlParam) {
     
        this.xmlParam = xmlParam;
    }

    public HttpClient(String url, Map<String, String> param) {
     
        this.url = url;
        this.param = param;
    }

    public HttpClient(String url) {
     
        this.url = url;
    }

    public void setParameter(Map<String, String> map) {
     
        param = map;
    }

    public void addParameter(String key, String value) {
     
        if (param == null)
            param = new HashMap<String, String>();
        param.put(key, value);
    }

    public void post() throws ClientProtocolException, IOException {
     
        HttpPost http = new HttpPost(url);
        setEntity(http);
        execute(http);
    }

    public void put() throws ClientProtocolException, IOException {
     
        HttpPut http = new HttpPut(url);
        setEntity(http);
        execute(http);
    }

    public void get() throws ClientProtocolException, IOException {
     
        if (param != null) {
     
            StringBuilder url = new StringBuilder(this.url);
            boolean isFirst = true;
            for (String key : param.keySet()) {
     
                if (isFirst) {
     
                    url.append("?");
                }else {
     
                    url.append("&");
                }
                url.append(key).append("=").append(param.get(key));
            }
            this.url = url.toString();
        }
        HttpGet http = new HttpGet(url);
        execute(http);
    }

    /**
     * set http post,put param
     */
    private void setEntity(HttpEntityEnclosingRequestBase http) {
     
        if (param != null) {
     
            List<NameValuePair> nvps = new LinkedList<NameValuePair>();
            for (String key : param.keySet()) {
     
                nvps.add(new BasicNameValuePair(key, param.get(key))); //   
            }
            http.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8)); //     
        }
        if (xmlParam != null) {
     
            http.setEntity(new StringEntity(xmlParam, Consts.UTF_8));
        }
    }

    private void execute(HttpUriRequest http) throws ClientProtocolException,
            IOException {
     
        CloseableHttpClient httpClient = null;
        try {
     
            if (isHttps) {
     
                SSLContext sslContext = new SSLContextBuilder()
                        .loadTrustMaterial(null, new TrustStrategy() {
     
                            //     
                            @Override
                            public boolean isTrusted(X509Certificate[] chain,
                                                     String authType)
                                    throws CertificateException {
     
                                return true;
                            }
                        }).build();
                SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                        sslContext);
                httpClient = HttpClients.custom().setSSLSocketFactory(sslsf)
                        .build();
            } else {
     
                httpClient = HttpClients.createDefault();
            }
            CloseableHttpResponse response = httpClient.execute(http);
            try {
     
                if (response != null) {
     
                    if (response.getStatusLine() != null) {
     
                        statusCode = response.getStatusLine().getStatusCode();
                    }
                    HttpEntity entity = response.getEntity();
                    //     
                    content = EntityUtils.toString(entity, Consts.UTF_8);
                }
            } finally {
     
                response.close();
            }
        } catch (Exception e) {
     
            e.printStackTrace();
        } finally {
     
            httpClient.close();
        }
    }

    public int getStatusCode() {
     
        return statusCode;
    }

    public String getContent() throws ParseException, IOException {
     
        return content;
    }
}
3、プロファイル:appication.yml
server:
  port: 18090
spring:
  application:
    name: pay
  main:
    allow-bean-definition-overriding: true
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:7001/eureka
  instance:
    prefer-ip-address: true
feign:
  hystrix:
    enabled: true
#hystrix   
hystrix:
  command:
    default:
      execution:
        timeout:
          #  enabled   false,       ribbon  
          enabled: true
        isolation:
          strategy: SEMAPHORE

#        
weixin:
  #  ID
  appid: wx8397f8696b538317
  #   
  partner: 1473426802
  #  
  partnerkey: T6m9iK73b0kn9g5v426MKfHQH7X8rKwb
  #           
  notifyurl: https://www.cnblogs.com/chawaner/
4、SprigBoot起動類
/**
 * @Author TeaBowl
 * @Date 2021/2/1 10:47
 * @Version 1.0
 */
@SpringBootApplication(exclude = {
     DataSourceAutoConfiguration.class})
@EnableEurekaClient
public class WeiXinPayApplication {
     
    public static void main(String[] args) {
     
        SpringApplication.run(WeiXinPayApplication.class,args);
    }
}
5、制御層
/**
 * @Author TeaBowl
 * @Date 2021/2/1 12:01
 * @Version 1.0
 */
@RestController
@RequestMapping(value = "/weixin/pay")
public class WeiXinPayController {
     

    @Autowired
    private WeixinPayService weixinPayService;

    /**
     *      
     * @param parameterMap:      
     * @return
     */
    @RequestMapping(value = "/create/native")
    public Result createNative(@RequestParam Map<String,String> parameterMap){
     
        Map<String,String> resultMap = weixinPayService.createnative(parameterMap);
        return new Result(true, StatusCode.OK,"           !",resultMap);
    }
}
6、アプリケーション層
/**
 * @Author TeaBowl
 * @Date 2021/2/1 11:01
 * @Version 1.0
 */
public interface WeixinPayService {
     
    /**
     *      
     * @param parameterMap:      
     * @return
     */
    Map createnative(Map<String,String> parameterMap);
}
/**
 * @Author TeaBowl
 * @Date 2021/2/1 11:00
 * @Version 1.0
 */
@Service
public class WeixinPayServiceImpl implements WeixinPayService {
     

    //  ID
    @Value("${weixin.appid}")
    private String appid;
    //   
    @Value("${weixin.partner}")
    private String partner;
    //  
    @Value("${weixin.partnerkey}")
    private String partnerkey;
    //    
    @Value("${weixin.notifyurl}")
    private String notifyurl;

    /**
     *      
     *
     * @param parameterMap:      
     * @return
     */
    @Override
    public Map createnative(Map<String, String> parameterMap) {
     
        try {
     
            //    
            //    Map        
            Map<String, String> paramMap = new HashMap<>();
            //    
            //  ID
            paramMap.put("appid", appid);
            //   
            paramMap.put("mch_id", partner);
            //     
            paramMap.put("nonce_str", WXPayUtil.generateNonceStr());
            //    
            paramMap.put("body", "         ");
            //   
            paramMap.put("out_trade_no", parameterMap.get("outtradeno"));
            //     ,   : 
            paramMap.put("total_fee", parameterMap.get("totalfee"));
            //  IP
            paramMap.put("spbill_create_ip", "127.0.0.1");
            //    , URL  
            paramMap.put("notify_url", notifyurl);
            //    ,NATIVE
            paramMap.put("trade_type", "NATIVE");

            //  
            //paramMap.put("sign","");
            //Map  XML  ,      
            //       ,       XML    
            String xmlStr = WXPayUtil.generateSignedXml(paramMap, partnerkey);

            //URL  ,        
            String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";

            //    :HTTPS
            //  HttpClient  , url        
            HttpClient httpClient = new HttpClient(url);
            //       HTTPS
            httpClient.setHttps(true);

            //    ,   XML      
            httpClient.setXmlParam(xmlStr);

            //    
            //  XML  ,  post  
            httpClient.post();

            //       ,        XML    
            String content = httpClient.getContent();
            System.out.println("content:" + content);

            //      Map
            Map<String, String> resultMap = WXPayUtil.xmlToMap(content);
            return resultMap;

        } catch (Exception e) {
     
            e.printStackTrace();
        }
        return null;
    }
}
二、テスト
1、ブラウザ入力要求アドレス:http://localhost:18090/weixin/pay/create/native?outtradeno=198999&totalfee=101
2、パラメータ解釈:
outtradeno:注文番号
totalfee:総金額
3、ブラウザ要求結果
{
     
    "flag": true,
    "code": 20000,
    "message": "           !",
    "data": {
     
        "nonce_str": "pUPI4MeBq1ikJbOJ",
        "code_url": "weixin://wxpay/bizpayurl?pr=qJVBnYYzz",
        "appid": "wx8397f8696b538317",
        "sign": "7BCED5501AD892D5490A109DADE3383F",
        "trade_type": "NATIVE",
        "return_msg": "OK",
        "result_code": "SUCCESS",
        "mch_id": "1473426802",
        "return_code": "SUCCESS",
        "prepay_id": "wx011403161517455f3f2880f7e02e920000"
    }
}
三、二次元コードを生成する
1、Qrious.jsを使ってページpayを書いて、二次元コードを生成するために使います.
<html>
<head>
<title>      demotitle>

<script src="qrious.js"> script>
head>
<body>
<img id="myqrious" >
body>
<script>
   var qrious = new QRious({
      
   		 element:document.getElementById("myqrious"),//          DOM  
   		 size:250,//         
		 level:'H',//          (H:    30%   )
		 value:'weixin://wxpay/bizpayurl?pr=qJVBnYYzz'//              
   })
script>
html>
2、pay.を開けて、2次元コードを表示し、ウィーチャット・スキャンコードで微信二维码支付_第1张图片を支払う.
四、支払い状態を照会する
1、制御層添加方法(controler)
/**
 *         
 * @param outtradeno:     ,        
 * @return
 */
@GetMapping(value = "/status/query")
public Result queryStatus(String outtradeno){
     
    //        
    Map map = weixinPayService.queryStatus(outtradeno);
    return new Result(true, StatusCode.OK,"          !",map);
}
2、アプリケーション層添加方法(service、serviceImpl)
/**
 *         
 * @param outtradeno:     ,        
 * @return
 */
 Map queryStatus(String outtradeno);
/**
     *         
     * @param outtradeno:     ,        
     * @return
     */
    @Override
    public Map queryStatus(String outtradeno) {
     
        try {
     
            //    
            //    Map        
            Map<String, String> paramMap = new HashMap<>();
            //    
            //  ID
            paramMap.put("appid", appid);
            //   
            paramMap.put("mch_id", partner);
            //     
            paramMap.put("nonce_str", WXPayUtil.generateNonceStr());
            //   
            paramMap.put("out_trade_no", outtradeno);

            //  
            //paramMap.put("sign","");
            //Map  XML  ,      
            //       ,       XML    
            String xmlStr = WXPayUtil.generateSignedXml(paramMap, partnerkey);

            //URL  ,          
            String url = "https://api.mch.weixin.qq.com/pay/orderquery";

            //    :HTTPS
            //  HttpClient  , url        
            HttpClient httpClient = new HttpClient(url);
            //       HTTPS
            httpClient.setHttps(true);

            //    ,   XML      
            httpClient.setXmlParam(xmlStr);

            //    
            //  XML  ,  post  
            httpClient.post();

            //       ,        XML    
            String content = httpClient.getContent();
            //System.out.println("content:" + content);

            //      Map
            Map<String, String> resultMap = WXPayUtil.xmlToMap(content);
            return resultMap;

        } catch (Exception e) {
     
            e.printStackTrace();
        }
        return null;
    }
3、ブラウザ入力要求アドレス:http://localhost:18090/weixin/pay/status/query?outtradeno=198999
パラメータ説明:outtradeno:注文番号
{
     
    "flag": true,
    "code": 20000,
    "message": "          !",
    "data": {
     
        "nonce_str": "9FMEOJb0nhdJzGOQ",
        "device_info": "",
        "out_trade_no": "198999",
        "trade_state": "NOTPAY",
        "appid": "wx8397f8696b538317",
        "total_fee": "101",
        "sign": "1C86209F252D64254542EFC5481FD0D0",
        "trade_state_desc": "     ",
        "return_msg": "OK",
        "result_code": "SUCCESS",
        "mch_id": "1473426802",
        "return_code": "SUCCESS"
    }
}
上のテストで二次元コードを支払う時、私は支払わなかったので、注文書の支払い状態を調べて「注文書はまだ支払われていません」と表示します.
五、支払結果のフィードバック
1、制御層添加方法
/**
     *           
     * @param request
     * @return
     */
    @RequestMapping(value = "/notify/url")
    public String notifyurl(HttpServletRequest request) throws Exception {
     
        //       ,               
        ServletInputStream inputStream = request.getInputStream();

        //    OutputStream   ->    
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        //     
        byte[] buffer = new byte[1024];

        //         
        int len = 0;

        //        ,        -1     
        while ((len = inputStream.read(buffer))!=-1){
     
            //                     
            // 0          
            byteArrayOutputStream.write(buffer,0,len);
        }

        // byteArrayOutputStream         
        //              
        byte[] byteArray = byteArrayOutputStream.toByteArray();

        //          xml   
        String xmlResult = new String(byteArray, "Utf-8");
        System.out.println("xmlResult:
"
+xmlResult); //xml Map Map<String, String> resultMap = WXPayUtil.xmlToMap(xmlResult); System.out.println("resultMap:
"
+resultMap); // String result = ""; return result; }
2、設定ファイルでのコールバックアドレスの変更は動的呼び出しとなります.
#        
weixin:
  #  ID
  appid: wx8397f8696b538317
  #   
  partner: 1473426802
  #  
  partnerkey: T6m9iK73b0kn9g5v426MKfHQH7X8rKwb
  #           
  #    :http://19453k43d4.51vip.biz:32375
  notifyurl: http://19453k43d4.51vip.biz:32375/weixin/pay/notify/url
3、二次元コードを作成する
ブラウザ入力要求:http://19453k43d4.51vip.biz:32375/weixin/pay//create/native?outtradeno=1999&totalfee=1
{
     
    "flag": true,
    "code": 20000,
    "message": "           !",
    "data": {
     
        "nonce_str": "pUPI4MeBq1ikJbOJ",
        "code_url": "weixin://wxpay/bizpayurl?pr=qJVBnYYzd",
        "appid": "wx8397f8696b538317",
        "sign": "7BCED5501AD892D5490A109DADE3383F",
        "trade_type": "NATIVE",
        "return_msg": "OK",
        "result_code": "SUCCESS",
        "mch_id": "1473426802",
        "return_code": "SUCCESS",
        "prepay_id": "wx011403161517455f3f2880f7e02e920000"
    }
}
4、pay.のvalueを修正するのは上のcode_です.url
<html>
<head>
<title>      demotitle>

<script src="qrious.js"> script>
head>
<body>
<img id="myqrious" >
body>
<script>
   var qrious = new QRious({
      
   		 element:document.getElementById("myqrious"),//          DOM  
   		 size:250,//         
		 level:'H',//          (H:    30%   )
		 value:'weixin://wxpay/bizpayurl?pr=qJVBnYYzd'//              
   })
script>
html>
5、pay.をダブルクリックして開けて、二次元コードを生成して、コードをスキャンして支払った後.
ブラウザ入力要求アドレス:http://19453k43d4.51vip.biz:32375/weixin/pay/status/query?outtradeno=1999
{
     
"flag": true,
"code": 20000,
"message": "          !",
    "data": {
     
        "transaction_id": "4200000517202002187004756359",
        "nonce_str": "ZxVmHMCc1mVr8rxR",
        "trade_state": "SUCCESS",
        "bank_type": "OTHERS",
        "openid": "oNpSGwaqHv74waDX0BLPNrFiYIUo",
        "sign": "3DC6A5346C914DE745DBBB7796039BC1",
        "return_msg": "OK",
        "fee_type": "CNY",
        "mch_id": "1473426802",
        "cash_fee": "1",
        "out_trade_no": "1999",
        "cash_fee_type": "CNY",
        "appid": "wx8397f8696b538317",
        "total_fee": "1",
        "trade_state_desc": "    ",
        "trade_type": "NATIVE",
        "result_code": "SUCCESS",
        "attach": "",
        "time_end": "20200218153715",
        "is_subscribe": "N",
        "return_code": "SUCCESS"
    }
}
6、コンソール出力を確認し、支払い結果通知があります.
六、MQメッセージ中間部品監聴
WeChatサービスから返された支払い状態は、MQメッセージのミドルウェアに送信される.
1、支払システムに依存を導入する


    org.springframework.boot
    spring-boot-starter-amqp

2、プロファイルappration.ymlに情報を追加する
 rabbitmq:
 	host:      
 	port:   
	username:    
	password:   
#          
mq:
  pay:
    exchange:
      order: exchange.order
    queue:
      order: queue.order
    routing:
      key: queue.order
実際の開発では、「サーバアドレス:1572」を登録して、手動でスイッチとキューを作成します.
3、キューバインディングスイッチの構成を作成する
/**
 * @Author TeaBowl
 * @Date 2021/2/3 11:26
 * @Version 1.0
 */
@Configuration
public class MQConfig {
     

    /**
     *           
     */
    @Autowired
    private  Environment env;

    /**
     *     
     * @return
     */
    @Bean
    public Queue OrderQueue (){
     
        //  :   
        return new Queue(env.getProperty("mq.pay.queue.order"));
    }

    /**
     *      
     * @return
     */
    @Bean
    public Exchange OrderExchange (){
     
        //  :    、     、      
        return new DirectExchange(env.getProperty("mq.pay.exchange.order"),true,false);
    }

    /**
     *        
     * @param orderQueue:  
     * @param orderExchange:   
     * @return
     */
    @Bean
    public Binding orderQueueExchange(Queue orderQueue,Exchange orderExchange){
     
        //         
        return BindingBuilder.bind(orderQueue).to(orderExchange).with(env.getProperty("mq.pay.routing.key")).noargs();
    }

}
4、controllerにMQ操作対象を注入する
//  MQ    
@Autowired
private RabbitTemplate rabbitTemplate;
5、controlllerにおける支払結果通知のフィードバック方法を修正する.
/**
     *           
     * @param request
     * @return
     */
    @RequestMapping(value = "/notify/url")
    public String notifyurl(HttpServletRequest request) throws Exception {
     
        //       ,               
        ServletInputStream inputStream = request.getInputStream();

        //    OutputStream   ->    
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        //     
        byte[] buffer = new byte[1024];

        //         
        int len = 0;

        //        ,        -1     
        while ((len = inputStream.read(buffer))!=-1){
     
            //                     
            // 0          
            byteArrayOutputStream.write(buffer,0,len);
        }

        // byteArrayOutputStream         
        //              
        byte[] byteArray = byteArrayOutputStream.toByteArray();

        //          xml   
        String xmlResult = new String(byteArray, "Utf-8");
        System.out.println("xmlResult:
"
+xmlResult); //xml Map Map<String, String> resultMap = WXPayUtil.xmlToMap(xmlResult); System.out.println("resultMap:
"
+resultMap); // MQ rabbitTemplate.convertAndSend("exchange.order","queue.order", JSON.toJSONString(resultMap)); // String result = ""; return result; }
注文システムはMQメッセージを傍受します.
1、注文システムに依存を導入する


    org.springframework.boot
    spring-boot-starter-amqp

2、プロファイルappration.ymlに情報を追加する
 rabbitmq:
    host:      
    port:   
    username:    
    password:   
#          
mq:
  pay:
    #   
    exchange:
      order: exchange.order
    #  
    queue:
      order: queue.order
    routing:
      key: queue.order
3、モニターMQ情報の設定を作成する
/**
 * @Author TeaBowl
 * @Date 2021/2/3 12:02
 * @Version 1.0
 *   MQ  
 */
@Component
@RabbitListener(queues = "${mq.pay.queue.order}")   //    
public class OrderMessageListener {
     
    /**
     *       
     * @param message:    
     */
    @RabbitHandler
    public void getMeaaage(String message){
     
        //        ,Json    Map
        Map<String, String> resultMap = JSON.parseObject(message, Map.class);
        System.out.println("          :
"
+resultMap); // MQ // :return_code :SUCCESS/FAIL String return_code = resultMap.get("return_code"); // if (return_code.equals("SUCCESS")){ // MQ // :result_code :SUCCESS/FAIL String result_code = resultMap.get("result_code"); // :out_trade_no String out_trade_no = resultMap.get("out_trade_no"); // if (result_code.equals("SUCCESS")){ // MQ // :transaction_id String transaction_id = resultMap.get("transaction_id"); }else { // , , , } } } }
4、二次元コードの実を作成する
a.ブラウザ要求アドレス:http://19453k43d4.51vip.biz:32375/weixin/pay/create/native?outtradeno=1769&totalfee=1
{
     
    "flag": true,
    "code": 20000,
    "message": "           !",
    "data": {
     
        "nonce_str": "QlLrzt4vdsKNck1d",
        "code_url": "weixin://wxpay/bizpayurl?pr=MjNPE2Dzz",
        "appid": "wx8397f8696b538317",
        "sign": "CD80E7E68014CF70C36535E231E0FF14",
        "trade_type": "NATIVE",
        "return_msg": "OK",
        "result_code": "SUCCESS",
        "mch_id": "1473426802",
        "return_code": "SUCCESS",
        "prepay_id": "wx03125509016851a5fca270399354320000"
    }
}
b.pay.の支払い先をcode_と修正する.urlアドレス
<html>
<head>
<title>      demotitle>

<script src="qrious.js"> script>
head>
<body>
	<img id="myqrious" >
body>
	<script>
	   var qrious = new QRious({
      
			 element:document.getElementById("myqrious"),//          DOM  
			 size:250,//         
			 level:'H',//          (H:    30%   )
			 value:'weixin://wxpay/bizpayurl?pr=MjNPE2Dzz'//              
	   })
	script>
html>
c.二次元コードピクチャ微信二维码支付_第2张图片、スイープコードの支払い後.ブラウザRabbiitMQのバックグラウンドを参照すると、「サーバアドレス:1572/〹/queues」参照メッセージ:微信二维码支付_第3张图片 微信二维码支付_第4张图片
七、注文状況を修正する
1、注文工程で修正する
アプリケーション層インターフェースにインターフェースを追加します.
/**
 *       
 * @param outtradeno:     
 * @param paytime:    
 * @param transactionid:     
 */
void updataStatus(String outtradeno,String paytime,String transactionid) throws  Exception;
アプリケーション層インターフェース実装クラス(Order ServiceImpl)では、追加方法が実現されます.
/**
     *       
     * @param outtradeno:     
     * @param paytime:    
     * @param transactionid:     
     */
    @Override
    public void updataStatus(String outtradeno, String paytime, String transactionid) throws Exception {
     
        //        ,      
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
        Date payTimeInfo = simpleDateFormat.parse(paytime);

        //       ,          order       
        Order order = orderMapper.selectByPrimaryKey(outtradeno);
        //      
        //      
        order.setPayTime(payTimeInfo);
        //      :0   ,1   ,2    
        order.setPayStatus("1");
        //       
        order.setTransactionId(transactionid);

        //            
        orderMapper.updateByPrimaryKeySelective(order);
    }
2、注文書を削除し、在庫を戻します.
      ,      ,                  ,               ;
        ,          ,       ,      。
アプリケーション層インターフェースにインターフェースを追加します.
/**
 *     ,  [    ]  ,    
 * @param outtradeno:     
 */
void deleteOrder(String outtradeno);
アプリケーション層インターフェース実装クラス(Order ServiceImpl)では、追加方法が実現されます.
/**
     *     ,  [    ]  ,    
     * @param outtradeno:     
     */
    @Override
    public void deleteOrder(String outtradeno) {
     
        //       ,          order       
        Order order = orderMapper.selectByPrimaryKey(outtradeno);

        //    
        //      
        order.setUpdateTime(new Date());
        //      :0   ,1   ,2    
        order.setPayStatus("2");
        //            
        orderMapper.updateByPrimaryKeySelective(order);

        //    ->              
    }
3、ドッキング傍受
MQ情報モニターの設定を変更します.Order Message Listener
受注アプリケーションを注入する操作対象
@Autowired
private OrderService orderService;
支払結果の傍受方法を修正する
/**
     *       
     * @param message:    
     */
    @RabbitHandler
    public void getMeaaage(String message) throws Exception {
     
        //        ,Json    Map
        Map<String, String> resultMap = JSON.parseObject(message, Map.class);
        System.out.println("          :
"
+resultMap); // MQ // :return_code :SUCCESS/FAIL String return_code = resultMap.get("return_code"); // if (return_code.equals("SUCCESS")){ // MQ // :result_code :SUCCESS/FAIL String result_code = resultMap.get("result_code"); // :out_trade_no String out_trade_no = resultMap.get("out_trade_no"); // if (result_code.equals("SUCCESS")){ // // : 、 、 orderService.updataStatus(out_trade_no,resultMap.get("time_end"),resultMap.get("transaction_id")); }else { // , , , // // , [ ] , orderService.deleteOrder(out_trade_no); } } }
4、テスト
二次元コード情報を作成し、ブラウザ入力要求:http://localhost:18090/weixin/pay/create/native?outtradeno=1355321180126445568&totalfee=1
{
     
    "flag": true,
    "code": 20000,
    "message": "           !",
    "data": {
     
        "nonce_str": "Dc7zjYlcdvPxienu",
        "code_url": "weixin://wxpay/bizpayurl?pr=s2V4HM3zz",
        "appid": "wx8397f8696b538317",
        "sign": "7D75E71E44AD669496C14684A66D8501",
        "trade_type": "NATIVE",
        "return_msg": "OK",
        "result_code": "SUCCESS",
        "mch_id": "1473426802",
        "return_code": "SUCCESS",
        "prepay_id": "wx04014823728571d0a1350cf856a41e0000"
    }
}
pay.の支払い先を修正します.
<html>
<head>
<title>      demotitle>

<script src="qrious.js"> script>
head>
<body>
	<img id="myqrious" >
body>
	<script>
	   var qrious = new QRious({
      
			 element:document.getElementById("myqrious"),//          DOM  
			 size:250,//         
			 level:'H',//          (H:    30%   )
			 value:'weixin://wxpay/bizpayurl?pr=s2V4HM3zz'//              
	   })
	script>
html>
pay.をダブルクリックして二次元コードを生成する微信二维码支付_第5张图片.
スキャンコードの支払いに成功した後、情報微信二维码支付_第6张图片が傍受されました.
データベース内の注文表も、傍受されたメッセージに基づいて変更されました. .